        Linux
     ================================================================
                                                   Linux Programmer's
                                                   Guide



















     Sven Goldt, Sven van der Meer,
     Skott Burkett, Matt Welsh                               ver 0.4
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


                                - 2 -


         .   (0.1)  
   1994 .      
      . 
      ,  
    ,   , ,  
 /.  ,    
  ,       
 .

     * 
        Linux   ,  
   .    slip ,
       mggetty. 
 sliplogin   ,     Linux 1.1.
     ,    
(Russ Nelson)       0.99   .

           
 Linux.       
  ;      
    ,    / 
  .

     1.   LINUX

       1991 .. (Linus Benedict Torvalds) 
   Minux   AT 386. 
   ,     
,   Linux.   1991    
e-mail      Minux.   
   Linux,   ,
      
POSIX.    Linux -   ,  
 ,   free.    Linux-  
.



                                - 3 -

     2.  LINUX

        LINUX-.     
  ,       LINUX.   
  ,   , 
  .    
 POSIX,   ,   
.         
 ,   ,      -
 POSIX.        
Linux Kernel Hacker's Guide (    LINUX 
).

     3.  libc

     libc: ISO 8859.1, , YP , 
,     (  
), ...,      libcompact (
  ),     ,
  , bsd 4.4lite-   
  libcourses, bsd-   libbsd, 
    libtermcap,     libdbm,
  libm,     crt0.o (entry to execute
programs in crt0.o ??? (- )),  sex- 
libeee (???  , ,   ,  , 
 - ),     libgmon.

      ,  -   libc  
  . ,       , 
,    a.out    elf
(executable and lincable format -    ),
      .  
   .

       libc    GNU (Library GNU
Public License).     , 
crt0.o.       
  .   ,

                                - 4 -

,    .

     4.  
   
       -     ( ) 
/    . 
Linux-1.2   140  .  , 
close()   Linux libc.      
,      syscall(). ,
 syscall-y -    ,  
  .      
,       libc - 
.     ,    
   libc,    syscall().  ,
     syscall- ( , ):

#include 

extern int syscall(int,...)

int my_close(int filedescriptor)
{
   return syscall(SYS_close, filedescriptor);
}

      i386    5-   
 -   .    
   _syscall     
      $how many developers chose
to support$.  _syscall    syscall(),
   ,     
,     .   
     _syscall- :).  
   close(),   _syscall.

#include 

_syscall1 (int, close, int, filedescriptor);

                                - 5 -


     _syscall1    close(),    :
 close()  libc     .

      syscall()- ( _syscall-)   -1,
    0     .   
      errno.

       ,   BSD  SYS V,  
  LINUX: audit(), audition(), fchroot(), getauid(),
getdents(), getmsg(), mincore(), poll(), putmsg(), setaudit(),
setauid().

     5. iotl

     iotcl    /   
     .  iotl:

iotl(unsigned int fd, unsigned int request, unsigned long argument)

        -1   , 0   
 (request)   ,    . 
    .    
  /dev  /proc.      , 
    ,     
   .   UNIX-,  
/   .     
-    ,     
iotl.   iotl      , 
     .









                                - 6 -

     6.   LINUX

     6.1. 

      Linux IPC (Inter-process communication) 
     .
           IPC:
     *   UNIX
     * FIFO ( )
     *     SYSV
     *     SYSV
     *      SYSV
     *   (  Berkeley) (  
)
     *   ( ) (  
)

         ,   
     /  
UNIX-,  Linux.

     6.2.   UNIX

     6.2.1.  

      -        
  .  -    
IPC,       
   UNIX.    
 (  half-duplex)  .

             UNIX
( shell-).

   ls | sort | lp

          ls   sort,  
sort   lp.     ,

                                - 7 -

 ()  .

             
shell-  ,     ,   
 .

        ,    
    .   
,       (),   
        ().  
,    ,     
        .
       
:

                     in     <-----
           Process                     Kernel
                     out    ----->

         ,    
  .       (fd0), 
      fd1.  
      .  
     , ,  
,   .  ,  Linux-  
  inode-. ,  inode  
  ,    -   .
       
/,     .

           ,  
-     ?   ,
,  ,    . 
    -  
  ,     
 (   ).   
  :


                                - 8 -

                     in   <-----            ----->   in
    Parent Process                 Kernel                  Child Process
                     out  ----->            <-----   out

       ,       
,   .     
  .      
?       ? 
    ""  
.       
     .    
  :

                     in   <-----                     in
    Parent Process                 Kernel                  Child Process
                     out                    <-----   out

        . ,    - 
 .      , 
  ,  ,   
/         (,  
      inode).

         ,    
write(),       -   read().
,    /     
   ! (,  , 
  , , , lseek(),   
.)

     6.2.2.    

            
  ,    shell-.  
   ,      
pipe().     ,  
    (integer), ,   ,  
    ,   

                                - 9 -

 .       
 (,  -   
).

SYSTEM CALL: pipe();

PROTOTYPE: int pipe( int fd[2] );
  RETURNS: 0   
           -1   :
              errno = EMFILE (  )
                      EMFILE (   )
                      EFAULT ( fd )

     NOTES: fd[0]   , fd[1] -  .

         ( 0)    
,       ( 1)   
 .  ,  fd1    fd0. 
 ,   ,   , 
 .
   #include 
   #include 
   #include 

   main()
   {
           int     fd[2];

           pipe(fd);
           .
           .
   }

     ,    decays      .
fd -   &fd[0].    ,  
  :



                                - 10 -

   #include 
   #include 
   #include 

   main()
   {
           int     fd[2];
           pid_t   childpid;

           pipe(fd);

           if((childpid = fork()) == -1)
           {
                   perror("fork");
                   exit(1);
           }
           .
           .
   }

           ,   
 fd1,     fd0.    
 ,     fd0,   - fd1.   
       ,   
 ,         
; EOF    ,     
.

   #include 
   #include 
   #include 
   main()
   {
           int     fd[2];
           pid_t   childpid;

     2.  LINUX


                                - 11 -

           if((childpid = fork()) == -1)
           {
                   perror("fork");
                   exit(1);
           }

           if(childpid == 0)
           {
                   /*    */
                   close(fd[0]);
           }
           else
           {
                   /*    */
                   close(fd[1]);
           }
           .
           .
   }

        ,    ,  
     
.

/*************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 *************************************************************************
 MODULE: pipe.c
 *************************************************************************/

   #include 
   #include 
   #include 

   int main(void)
   {
           int     fd[2], nbytes;

                                - 12 -

           pid_t   childpid;
           char    string[] = "Hello, world!\n";
           char    readbuffer[80];

           pipe(fd);

           if((childpid = fork()) == -1)
           {
                   perror("fork");
                   exit(1);
           }

           if(childpid == 0)
           {
                   /*    */
                   close(fd[0]);

                   /*  "string"    */
                   write(fd[1], string, strlen(string));
                   exit(0);
           }
           else
           {
                   /*    */
                   close(fd[1]);

                   /*     */
                   nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                   printf("Received string: %s", readbuffer);
           }

           return(0);
   }

            
.    exec()  ,  
 .      dup():


                                - 13 -

SYSTEM CALL: dup();

PROTOTYPE: int dup( int oldfd );
  RETURNS: new descriptor on success
           -1 on error: errno = EBADF (oldfd )
                                EBADF ($newfd is out of range$)
                                EMFILE (    
                                        )

     NOTES:    !   !
       ,     
,       
.   dup()    
   .

     :

        .
        .
        childpid = fork();

        if(childpid == 0)
        {
                /*     */
                close(0);

                /*     stdin */
                dup(fd[0]);
                execlp("sort", "sort", NULL);
                .
        }

        0 (stdin)  ,  dup()
    (fd0)    .
    execlp(),     
 sort.    exec()- 
  ,  ,     
  !  ,  

                                - 14 -

-   ,   sort.

        , dup2(),   
.      Version 7 of UNIX 
  BSD,      POSIX.

SYSTEM CALL: dup2();

PROTOTYPE: int dup2( int oldfd, int newfd );
  RETURNS:     
           -1   : errno = EBADF (oldfd )
                                EBADF ($newfd is out of range$)
                                EMFILE (    
                                       )

NOTES:    dup2()!

             
     . ,  
,  ,       
.     dup()   
   close().    
        
  .        
,     . dup2()   
 .

   :

   .
   .
   childpid = fork();

   if(childpid == 0)
   {
      /*   ,    
            */
      dup2(0, fd[0]);

                                - 15 -

      execlp("sort", "sort", NULL);
      .
      .
   }

     6.2.3.  -  !

            
    ,    .

LIBRARY FUNCTION: popen();

PROTOTYPE: FILE *popen ( char *command, char *type );
   RETURNS:      
            NULL   fork()  pipe()

NOTES:  ,   fork/exec,  command

           
  pipe() .    
,  Bourne shell    command 
shell-.      ,
type.    "r"  "w" -    ,   
  ,  !  Linux-     ,
    "type". ,  
  "rw",       "read".


     ,  popen(),    pclose().  
 , ,   [] popen/pclose
share,       I/O 
fopen()  fclose().LIBRARY FUNCTION: pclose();

PROTOTYPE: int pclose( FILE *stream )
   RETURNS:      wait4()
            -1,  "stream"     wait4()



                                - 16 -

NOTES:     ,   .

      pclose()  wait4()  , 
popen()-.   ,     
.   ,     ,
  fclose()  ,   
 /.

      ,      
    :

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: popen1.c
 ****************************************************************************/

#include 

#define MAXSTRS 5

int main(void)
{
   int cntr;
   FILE *pipe_fp;
   char *strings[MAXSTRS] = {"echo", "bravo", "alpha", "charlie", "delta"};

   /*     popen() */
   if (( pipe_fp = popen("sort", "w")) == NULL)
   {
      perror("popen");
      exit(1);
   }

   /*  */
   for(cntr=0; cntr /tmp/foo", "w")
popen("sort | uniq | more", "w");

         popen()-,  
,    ( -   ls,  - 
):

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: popen2.c
 ****************************************************************************/

#include 

int main(void)
{
   FILE *pipein_fp, *pipeout_fp;
   char readbuf[80];



                                - 18 -

   /*     popen() */
   if (( pipein_fp = popen("ls", "r")) == NULL)
   {
      perror("popen");
      exit(1);
   }

   /*     popen() */
   if (( pipeout_fp = popen("sort", "w")) == NULL)
   {
      perror("popen");
      exit(1);
   }

   /*  */
   while(fgets(readbuf, 80, pipein_fp))
      fputs(readbuf, pipeout_fp);

   /*   */
   pclose(pipein_fp);
   pclose(pipeout_fp);

   return(0);
}

         popen(),  
,        
 :

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: popen3.c
 ****************************************************************************/

#include 


                                - 19 -

int main(int argc, char *argv[])
{
   FILE *pipe_fp, *infile;
   char readbuf[80];

   if( argc != 3 ) {
      fpintf(stderr, "USAGE": popen3 [command] [filename]\n);
      exit(1);
   }

   /*    */
   if (( infile = popen(argv[2], "rt")) == NULL)
   {
      perror("fopen");
      exit(1);
   }

   /*     popen() */
   if (( pipe_fp = popen(argv[1], "w")) == NULL)
   {
      perror("popen");
      exit(1);
   }
   /*  */
   do {
      fgets(readbuf, 80, infile);
      if(feof(infile)) break;

      fputs(readbuf, pipe_fp);
   } while(!feof(infile));

   fclose(infile);
   pclose(pipe_fp);

   return(0);
}



                                - 20 -

           :

popen3 sort popen3.c
popen3 cat popen3.c
popen3 more popen3.c
popen3 cat popen3.c | grep main

     6.2.4.  ()   

           "",  
     .   
. POSIX    /usr/include/posix_lim.h, 
        :

#define _POSIX_PIPE_BUF      512

              512 .
,     ,      
. ,  Linux-    
  "linux/limits.h"  :

#define PIPE_BUF      4096

        , Linux  
 ,  POSIX-,  . 
    ,    
 (FIFOS). ,   ,  
,  ,    ,   
  ,    , ..
         .

     6.2.5.    

     *       
       
-.



                                - 21 -

     *  pipe()      fork(), 
    -! (  
popen()).

     *       
 .      ,
 ,       ,  
  .       
 (FIFOS).

     6.3.   (FIFOs - First In First Out)

     6.3.1.  

           ,   
,       .

     *       
   .

     *       
 .

     *        
   ,   / .

     6.3.2.  FIFO

          .  
     shell-.

mknod MYFIFO p
mkfifo a=rw MYFIFO

          ,  
.  mkfifo    
    FIFO   . 
 mknod     chmod.

                                - 22 -


      FIFO      
    "p",   
  .

$ ls -1 MYFIFO
^prw-r--r--  1 root  root      0 Dec 14 22:15 MYFIFO| ...

      ,    
   .    
Linux, eh?

       FIFO  ,     
  mknod():

LIBRARY FUNCTION: mknod();

PROTOTYPE: int mknod( char *pathname, mode_t mode, dev_t dev );
   RETURNS: 0   ,
            -1   :
               errno = EFAULT (  )
                       EACCESS ( )
                       ENAMETOOLONG (  )
                       ENOENT (  )
                       ENOTDIR (  )
                       (   man page  mknod)

     NOTES:     (,   
FIFO)

         mknod()- man page,  
     FIFO  :

   mknod("/tmp/MYFIFO", S_IFIFO|0666, 0);

         "/tmp/MYFIFO"   FIFO-.
  -  "0666",     
 umask,  :

                                - 23 -


   final_umask = requested_permissions & ~original_umask ...

       -    umask()  ,
    umask-:

   umask(0);
   mknod("/tmp/MYFIFO", S_IFIFO|0666, 0);

      ,   mknod()- ,  
    .      
     .

     6.3.3.  FIFO

      / FIFO,  ,  ,  
 ,   .    
 ,      "open" 
 .     ,
    ,      .
        ,  
fopen()-   fclose()-.

       -:

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: fifoserver.c
 ****************************************************************************

#include 
#include #include 
#include 

#include 


                                - 24 -

#define FIFO_FILE   "MYFIFO"

int main(void)
{
   FILE *fp;
   char readbuf[80];

   /*  FIFO,      */
   umask(0);
   mknod(FIFO_FILE, S_IFIFO|0666, 0);

   while(1)
   {
      fp = fopen(FIFO_FILE, "r");
      fgets(readbuf, 80, fp);
      printf("Received string: %s\n", readbuf);
      fclose(fp);
   }

   return(0);
}

      FIFO   ,   
 ,   :

   $ fifoserver&

         ,   
     :

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: fifoclient.c
 ****************************************************************************

#include 

                                - 25 -

#include 

#define FIFO_FILE   "MYFIFO"int main(int argc, char *argv[])
{
   FILE *fp;

   if ( argc != 2 ) {
      printf("USAGE: fifoclient [string]\n");
      exit(1);
   }

   fputs(argv[1], fp);

   fclose(fp);
   return(0);
}

     6.3.4.    FIFO

      FIFO   ,      ,
 -     FIFO  .
   .    ,
     O_NONBLOCK    open(),
   .

                 
   .    
       ,
   ,   .

     6.3.5.  SIGPIPE

     ,   ,  ,    
  .      ,  
,      SIGPIPE.  ,  
     .



                                - 26 -

     6.4 System V IPC

     6.4.1.  

       System V AT&T     IPC 
( ,    ). POSIX  
  ,     
. ,  (BSD)     IPC
  ,   System V. Linux 
    IPC (BSD  System V),   
     .

      System V IPC  LINUX-  
 (Krishna Balasubramanian),
balasub@cis.ohio-state.edu.

      IPC

       IPC   IPC . ( 
 " IPC",     ,
     .) 
       IPC.
,      ,
,   ,    ID, 
   .

      IPC      . 
, ,       
"12345",     "12345"   - 
   () -  .

      IPC

        ID  .    
 -  -.   
       .



                                - 27 -

     (  -  ,    
.  ,       
  .      , 
.)

       System V IPC ""   IPC 
.  " ",   , 
  IPC.

     ,   ,   
    .  ,    
   .  ftok()  
    ,   :

   LIBRARY FUNCTION: ftok();

   PROTOTYPE: key_t ftok( char *pathname, char proj );
     RETURNS:  IPC    
              -1   , errno    
                  stat()

      ftok()-     inode 
    -  ,    -
 .    ,  
    ,  , 
 .

         key_t   mykey;
         mykey = ftok ("/tmp/myapp", 'a');

          /tmp/myapp  
  'a'.    -
  .

         key_t   mykey;
         mykey = ftok(".", 'a');



                                - 28 -

            
 .        
,   ..,      .  
    ftok()-.  , 
 -     ""
,      .

     ,  ,   ,  
   IPC      
 IPC.

      ipcs     System V IPC.
LINUX- ipcs     .

   ipcs      -q:      
   ipcs      -s:     
   ipcs      -m:      
   ipcs  --help:    

           .  
   ipcs-:

------ Shared Memory Segments --------
shmid     owner     perms     bytes     nattch     status

------ Semaphore Arrays --------
^semid     owner     perms     nsems     status

------ Message Queues --------
msqid     owner     perms     used-butes     messages
0         root      660       5              1

            "0". 
  root      660,
 -rw-rw---.     .

      ipcs -    , 
      IPC-. 

                                - 29 -

,  ,   .

      ipcrm

      ipcrm   IPC  . , 
 IPC       
 (      ),  
  "" .     
.

       ipcrm :

         ipcrm   

      ,     
 (msg),   (sem),   
 (shm). IPC ID      ipcs. ,
 ID         IPC, 
    .

     6.4.2.  

      

            
 .        
     .  
    IPC.

         

           ,  System V
IPC,        ,
    .    
        , 
       .



                                - 30 -

      

      ,   ,  msgbuf.  
     .    
  ,   ,     
  msgbuf.     linux/msg.h:

/*     msgsnd  msgrcv*/
struct msgbuf {
    long mtype;          /*   */
    char mtext[1];       /*   */
};

   mtype
      ,   .   
!

   mtext
      .

          
     .   ,
,   -   
,    - - ; 
         1,
- -   2  ..   
.

       ,      
 (   mtext).       
 ,        . 
  ,     
 , , :






                                - 31 -

struct my_msgbuf {
   long   mtype;         /*   */
   long   request_id;    /*   */
   struct client info;   /*    */
}

          ,   
  ,     -  !  
  ,    ,   
 .

     , ,     .
 LINUX-    linux/msg.h:

#define MSGMAX 4056 /* <= 4056 */ /*   ,
                                      */

         ,  4056 ,   
 mtype,   4  (long).

      msg 

           msg.   
linux/msg.h  :

struct msg {
   struct msg *msg_next;   /*     */
   long   msg_type;
   char  *msg_spot;        /*    */
   short  msg_ts;          /*   */
};
   msg_next
          .  
        .

   msg_type
      ,      msgbuf.


                                - 32 -

   msg_spot
         .

   msg_ts
       ( ) .

      msqid_ds 

         IPC-   ,
  .     
msqid_ds.  ,      
     .    linux/msg.h
 :

/*  msqid      */
struct msqid_ds {
   struct ipc_perm msg_perm;
   struct msg *msg_first;     /*     */
   struct msg *msg_last;      /*     */
   time_t msg_stime;          /*    msgsnd */
   time_t msg_rtime;          /*    msgrcv */
   time_t msg_ctime;          /*    */
   struct wait_queue *wwait;
   struct wait_queue *rwait;
   ushort msg_cbytes;
   ushort msg_qnum;
   ushort msg_qbytes;         /*      */
   ushort msg_lspid;          /* pid   msgsnd */
   ushort msg_lrpid;          /*   pid */
};

            
,  -     .

   msg_perm
       ipc_perm,   linux/ipc.h. 
      ,  
      (uid  ..).

                                - 33 -


   msg_first
           ( ).

   msg_last
          ( ).

   msg_stime
       (time_t)     .

   msg_rtime
           .

   msg_ctime
        ,   
(   ).

   wwait  rwait
         .  , 
        
(   ,    ).

   msg_cbytes
      ,    (   ).

   msg_qnum
           .

   msg_qbytes
       .

   msg_lspid
     PID ,     .

  msg_lrpid
     PID  ,    .

      ipc_perm 

                                - 34 -


         IPC-    
ipc_perm. ,     
    ipc_perm   . 
    linux/ipc.h.

struct ipc_perm {
   key_t  key;
   ushort uid;    /* euid  egid  */
   ushort gid;   ushort cuid;   /* euid  egid  */
   ushort cgid;
   ushort mode;   /*  , .    */
   ushort seq;    /*     */
};

           .  
   IPC-      
   (  ).  
   ,  unsigned short. , 
   .    IPC 
    (),  
     IPC,  
  .    ? .


       msgget()   ,   
    .

SYSTEM CALL: msgget()

PROTOTYPE: int msgget( key_t key, int msgflg );
  RETURNS:      ;
           -1   .  
                errno = EACCESS ( )
                        EEXIST (   ,  )
                        EIDRM (   )
                        ENOENT (  )
                        ENOMEM (      )

                                - 35 -

                        ENOSPC (    )

    NOTES:

       msgget()   (   
 ftok()).        
 .        
    msgflg:

  IPC_CREAT
     ,      .

  IPC_EXCL
         IPC_CREAT,    
  .

      msgget()  IPC_CREAT,   IPC_EXCL  
 (     ) .
 IPC_EXCL   IPC_CREAT    ,
,    ,  .
 IPC_EXCL ,   c IPC_CREAT  
,         
.

         OR-   . 
IPC-   ,      
  UNIX-.

            
.

int open_queue( key_t keyval )
{
   int 	qid;

   if ((qid = msgget ( keyval, IPC_CREAT | 0660 )) == -1)
   {
      return (-1);

                                - 36 -

   }

   return (qid);
}

          0660. 
     (int)  -1 
 .    -  .

       msgsnd()

       ,     
 .     , 
  msgsnd():

SYSTEM CALL: msgsnd();

PROTOTYPE: int msgsnd( int msqid, struct msgbuf *msgp, int msgsz,
                       int msgflg );
  RETURNS: 0   
           -1   :
              errno =
     EAGAIN ( ,   IPC_NOWAIT)
     EACCES ( ,    )
     EFAULT ( msgp , ...)
     EIDRM (  )
     EINTR (     )
     EINVAL (   ,
      )
     ENOMEM (      )

     NOTES:

       msgsnd -   ,
   msgget.  , msgp -
       .
 msgsz     ,   
 (long 4 ).

                                - 37 -


      msgflg    :
     IPC_NOWAIT
       ,      ,
    .    
  ,   
(),     .

           :

int send_message( int qid, struct mymsgbuf *qbuf )
{
   int  result, length;

   /*        sizeof(mtype) */
   length = sizeof(struct mymsgbuf) - sizeof(long);

   if((result = msgsnd( qid, qbuf, length, 0)) == -1)
   {
       return(-1);
   }

   return(result);
}

         ,   
 (qbuf),   ,  qid. 
      :

#include 
#include 
#include 
#include 

main()
{
   int qid;
   key_t msgkey;

                                - 38 -

   struct mymsgbuf {
      long   mtype;     /*   */
      int    request;   /*    */
      double salary;    /*  */
   } msg;

   /*  IPC- */
   msgkey = ftok(".", 'm');

   /* /  */
   if (( qid = open_queue( msgkey)) == -1) {
      perror("open_queue");
      exit(1);
   }

   /*      */
   msg.type    = 1;  /*     ! */
   msg.request = 1;  /*   1 */
   msg.salary  = 1000.00; /*   2
                             (  ! - .) */

   /* ! */
   if((send_message( qid, &msg )) == -1) {
     perror("send_message");
     exit(1);
   }
}

      /     
     (  
       
).   send_message    
.

     ,      ,  
 ipcs     . ,  
  .      msgrcv():


                                - 39 -

SYSTEM CALL: msgrcv();

PROTOTYPE: int msgrcv( int msqid, struct msgbuf *msgp, int msgsz,
                       long mtype, $$)
  RETURNS:  ,    
           -1   :
              errno = E2BIG (  ,  msgsz, $$)
                      EACCES (   )
                      EFAULT (,    msgp, )
                      EIDRM (     
                             )
                      EINTR (  )
                      EINVAL (msgqid   msgsz  0)
                      ENOMSG ( IPC_NOWAIT,    
                                ,  )
NOTES:

     ,    ,   
  (    
 msgget).   (msgp)   
,     .  , msgsz,
  -     mtype.
  ,     :

msgsz = sizeof(struct mymsgbuf) - sizeof(long);
      , mtype -   ,  
.         
      ,   msgp.
   :  mtype = 0,   
  ,   .

      IPC_NOWAIT   ,    
 , msgrcv   
ENOMSG.      ,  
   ,   msgrcv().
,    ,  ,  
 EIDRM. EINTR ,   , 
       

                                - 40 -

.

       -    
 .

int read_message( int qid, long type, struct mymsgbuf *qbuf )
{
   int   result, length;

   /*        sizeof(mtype) */
   length = sizeof(struct mymsgbuf) - sizeof(long);

   if((result = msgrcv( qid, qbuf, length, type, 0 )) == -1)
   {
      return(-1);
   }

   return(result);
}

             
.

      MSG_NOERROR  msgflg   
.     ,  msgsz, 
MSG_NOERROR ,      
msgsz .   msgrcv()  -1 (E2BIG),  
     .   
     ,  
 ""  ,  ,   ,
  .

int peek_message( int qid, long type )
{
   int   result, length;

   if((result = msgrcv( qid, NULL, 0, type, IPC_NOWAIT )) == -1)
   {      if(errno == E2BIG)

                                - 41 -

         return(TRUE);
   }

   return(FALSE);
}

            .  
   ,    .  
  E2BIG,   ,  
  .    TRUE 
 ,  FALSE -   .  
  IPC_NOWAIT,   ,  
  .

       msgtl()

       -   
        
 .    
 ,     .

           
 msgtl.

SYSTEM CALL: msgctl()

PROTOTYPE: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );
  RETURNS: 0   
           -1   
              errno = EACCES (     cmd  IPC_STAT)
                      EFAULT (,    buf, 
                                IPC_SET  IPC_STAT)
                      EIDRM  (     )
                      EINVAL ( msqid  msgsz  0)
                      EPERM  (IPC_SET-  IPC_RMID- 
                               ,     
                              ( ))


                                - 42 -

NOTES:

         ,    
       .
 , -    ,  
      IPC.  
 msgctl()    
    .    .

   IPC_STAT
        buf  msqid_ds   .

   IPC_SET
        ipc_perm  msqid.
   .

   IPC_RMID
        .

            
: msqid_ds.       
,   . IPC_STAT   
    .    ,
         .

int get_queue_ds( int qid, struct msgqid_ds *qbuf )
{
   if( msgctl( qid, IPC_STAT, qbuf) == -1 )
   {
      return(-1);
   }

   return(0);
}

          ,  
  -1.     ,  
0,        

                                - 43 -

     qid.

             ?
,   ,   ipc_perm.  
 ,      .  
    mode, uid  gid.

        ,   
.        (, "660").

int change_queue_mode( int qid, char *mode )
{
   struct msqid_ds tmpbuf;

   /*      */
   get_queue_ds( qid, &tmpbuf );

   /*         */
   sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);   /*    */
   if( msgctl( qid, IPC_SET, &tmpbuf ) == -1 )
   {
      return(-1);
   }

   return(0);
}

            
  get_queue_ds;  sscanf()   mode
 msg_perm.    ,  msgctl c IPC_SET
   .

     !   ,     
! ,  IPC-  ,    
     .  ,   
  ipcs-,  ,      .



                                - 44 -

      ,     ,  .
,   , IPC-    
     .  
          
  ,   ,      
 .          , 
 msgctl(),   IPC_RMID:

int remove_queue( int qid )
{
   if( msgctl( qid, IPC_RMID, 0) == -1)
   {
      return(-1)
   }

   return(0);
}

      -  0,    
,     -1.   
       .

     msgtool:    

             
     . 
       
  . ,     
    .    
  .

          ,    -  
     .   
,       
.  ,   
IPC-    - msgtool().  msgtool() 
   ,      
.

                                - 45 -


     

      msgtool()-     , 
     shell.     ,
 ,       
   .     
  .  -   ,  
    .

       

      
     msgtool s (type) "text"

      
     msgtool  (type)

       
     msgtool (mode)

      
     msgtool d

              

   msgtool  s  1 test
   msgtool  s  5 test
   msgtool  s  1 "This is test"
   msgtool  r  1
   msgtool  d
   msgtool  m  660

     

     ,   ,    msgtool. 
    ,   System V
IPC.    System V IPC  ,  

                                - 46 -

 !

       ,      
,    .

     .  msgtool  ftok()  
 IPC,     ,  
.   -    ,   
  .       
 msgtool,  "/tmp/msgtool",      
    .

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: msgtool.c
 ****************************************************************************
           SysV
 ****************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#define MAX_SEND_SIZE 80

struct mymsgbuf {
   long mtype;
   char mtext[MAX_SEND_SIZE];
};

void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text);
void read_message(int qid, struct mymsgbuf *qbuf, long type);
void remove_queue(int qid);
void change_queue_mode(int qid, char *mode);

                                - 47 -

void usage(void);

int main(int argc, char *argv[])
{
   key_t key;
   int msgqueue_id;
   struct mymsgbuf qbuf;

   if(argc == 1)
      usage();

   /*      ftok() */
   key = ftok(".",'m');

   /*   -    */
   if((msgqueue_id = msgget(key, IPC_CREAT|0660)) == -1) {
      perror("msgget");
      exit(1);
   }

   switch(tolower(argv[1][0]))
   {
      case 's': send_message(msgqueue_id, (struct mymsg buf *)&qbuf,
                             atol(argv[2]), argv[3]);
                break;
      case 'r': read_message(msgqueue_id, &qbuf, atol(argv[2]));
                break;
      case 'd': remove_queue(msgqueue_id);
                break;
      case 'm': change_queue_mode(msgqueue_id, argv[2]);
                break;
      default:  usage();
   }   return(0);
}





                                - 48 -

void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text)
{
   /*     */
   printf("Sending a message ...\n");
   qbuf->mtype = type;
   strcopy(qbuf->mtext, text);

   if((msgsnd(qid, (struct msgbuf *)qbuf,
          strlen(qbuf->mtext)+1, 0)) == -1)
   {
      perror("msgsnd");
      exit(1);
   }
}

void read_message(int qid, struct mymsgbuf *qbuf, long type)
{
  /*     */
  printf("Reading a message ...\");
  qbuf->mtype = type;
  msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0);

  printf("Type: %ld Text: %s\n", qbuf->mtype, qbuf->mtext);
}

void remove_queue(int qid)
{
   /*   */
   msgctl(qid, IPC_RMID, 0);
}

void change_queue_mode(int qid, char *mode)
{
   struct msqid_ds myqueue_ds;

   /*    */
   msgctl(qid, IPC_STAT, &myqueue_ds);


                                - 49 -

   /*        */
   sscanf(mode, "%ho", &myqueue_ds.msg_perm.mode)

   /*        */
   msgctl(qid, IPC_SET, &myqueue_ds);
}

void usage(void)
{
   fprintf(stderr, "msgtool - A utility for tinkering with msg queues\n");
   fprintf(stderr, "\nUSAGE: msgtool (s)end  \n");
   fprintf(stderr, "                 (r)ecv \n");
   fprintf(stderr, "                 (d)elete\n");
   fprintf(stderr, "                 (m)ode \n");
   exit(1);
}

     6.4.3. 

      

           , 
   .      
,      ,  
  .     
       IPC-.  
,    ,    ,  
      .

      ""    
 ,  "",  
  ( ,       - .)
  .       
.    ON (  )  
    OFF ( )   
( ).



                                - 50 -

           ,  
,   IPC   ,   
. ,      , 
   .

          -    .
    .   , 
 ,      
.      
       .

     ,      5 
.    5  -    
.        
  ,     1,  
   .

         .     
      1.  ,   
   ,   
   1.     0.  
 System V      
.         , 
   .

          ,  
   1.      1  
   .

       ,     .
,    ,  
    ,    0  1. 
      500   ,   
   500,    1 
       .  
   ,      
  ,    , 
         (  

                                - 51 -

 ).

      ,     ,  
   ,     .

      semid_ds 

      ,     ,    
      
.    linux/sem.h:

/*   semid      */
struct semid_ds {
   struct ipc_perm sem_perm;     /*  , . ipc.h */
   time_t          sem_otime;    /*   semop- */
   time_t          sem_ctime;    /*    */
   struct sem      *sem_base;    /*       */
   struct wait_queue *eventn;
   struct wait_queue *eventz;
   struct sem_undo *undo;        /*  undo    */
   ushort          sem_nsems;    /*     */
};

      ,    ,    
    ,    . 
  .

   sem_perm
        ipc_perm,    linux/ipc.h. 
      ,  
      (uid  ..).

   sem_otime
        semop() (  ).

   sem_ctime
        .


                                - 52 -

   sem_base
          .

   sem_undo
       undo   (   ).

   sem_nsems
        .

      sem 

      sem_ds      .  
   sem,    linux/sem.h:

/*       */
struct sem {
   short   sempid;    /* pid   */
   ushort  semval;    /*   */
   ushort  semncnt;    /*  ,   semval- */
   ushort  semzcnt;   /*  ,  semval- ,  0 */
};

  sem_pid
     ID ,   

  sem_semval
       

  sem_semncnt
      ,    

  sem_semzcnt
      ,    

       semget()   ,  
       .



                                - 53 -

SYSTEM CALL: semget();

PROTOTYPE: int semget ( key_t key, int nsems, int semflg );
  RETURNS: IPC-     
           -1   
              errno: EACCESS ( )
                     EEXIST (   (IPC_ESCL))
                     EIDRM (   )
                     ENOENT (  ,   
                               IPC_CREAT-)
                     ENOMEM (     )
                     ENOSPC (     )
NOTES:

       semget() -   (   
ftok()-).       ,
  .        
        
 msgflg.

   IPC_CREAT
       ,       .

   IPC_EXCL
         IPC_CREAT  , 
  .

      IPC_CREAT   ,  semget() 
   -      
.  IPC_EXCL    IPC_CREAT,  
  , ,    , 
    -1.    IPC_EXCL ,   
IPC_CREAT    ,     
     .

          System V IPC,   
  OR-       
.

                                - 54 -


      nems   ,  
   .     
 .     
"linux/sem.h":

#define SEMMSL  32 /* <= 512 */

      nsems ,    
.

      -     
.
           0660.  
      -1  
.          
,   ,   .  ,
  IPC_EXCL    
   .

       semop()

SYSTEMCALL: semop();

PROTOTYPE: int semop( int semid, struct sembuf *sops, unsigned nsops);
  RETURNS: 0    (  )
           -1   
              errno: E2BIG (nsops    
                             )
                     EACCESS ( )
                     EAGAIN (   IPC_NOWAIT   
                              )
                     EFAULT (sops    )
                     EIDRM (  )
                     EINTR (    )
                     EINVAL (     semid)
                     ENOMEM (  SEM_UNDO,    
                                undo-)

                                - 55 -

                     ERANGE (    
                              )
NOTES:

       semop()    (  
 semget-).   (sops) -   
 ,   ,   (nsops)
     .

      sops     sembuf.  
  linux/sem.h  :

/*   semop     */
struct sembuf {   ushort sem_num;   /*     */
   short  sem_op;    /*    */
   short  sem_flg;   /*  */
};

   sem_num
      ,      .

   sem_op
       (,   
).

   sem_flg
      .

      sem_op ,      
(  - .).    ,
  .  IPC_NOWAIT  , 
  ,     
  (     ).

      sem_op ,      .
      .
     ,   
 !

                                - 56 -


     ,  sem_op  ,    
 (sleep()),      . 
  ,      100%.
    ,   
,     , 
   .

        semop,     .
     ,    
  .       
(  )       1
(    ).

      ,    ,   
,   .   ,   
  .    sembuf, 
  :

struct sembuf sem_lock = { 0, -1, IPC_NOWAIT };

          -1 
 0   .  ,  
     ()   
. IPC_NOWAIT ,    
,   ,   .  
 sembuf- semop-:

if(semop(sid, %sem_lock, 1) == -1)
   perror("semop");

       (nsops) ,      (1)
 (    sembuf    ).
 sid  IPC    
.

         ,    
  ,    

                                - 57 -

.

struct sembuf sem_unlock = { 0, 1, IPC_NOWAIT };

          1 
  0  .  ,  
    .

       semctl()

SYSTEM CALL: semctl();
PROTOTYPE: int semctl ( int semid, int semnum, int cmd, union semun arg );
   RETURNS:     
            -1   :
               errno = EACCESS ( )
                       EFAULT (,   arg, )
                       EIDRM (  )
                       EINVAL (     semid)
                       EPERM (EUID     cmd  arg-)
                       ERANGE (     
                               )
NOTES:  ,   

      semctl     
.     msgctl   .
       ,  , 
  . ,     
,    .    
    IPC-,     
.

          cmd  
,     IPC-.  
   .  msgctl   
   . ,    
       
         . 
   ,  

                                - 58 -

      . 
 (union)      %(.  
   ,    
.

       semctl()   (  
  semget).   (semun) -  
,    .  ,   
     ,   
 .

      cmd   ,   
 .    ,   
IPC_STAT/IPC_SET     ,  
 :

   IPC_STAT
       semid_ds       
 buf   semun.

   IPC_SET
        ipc_perm  semid_ds 
.

   IPC_RMID
        .

   GETALL
           .
      unsigned short, 
    array.

   GETNCNT
       ,     .

   GETPID
      PID ,    semop.


                                - 59 -

   GETVAL
          .

   GETZCNT
       ,   
.

   SETALL
        ,   
array .

   SETVAL
           
val .

      arg  semtl()    semun,
  linux/sem.h  :

/*  arg    semctl */
union semun {
   int val;                /*   SETVAL- */
   struct semid_ds *buf;   /*   IPC_STAT  IPC_SET */
   ushort *array;          /*   GETALL  SETALL */
   struct seminfo *__buf;  /*   IPC_INFO */
   void *__pad;
};

   val
      ,     
SETVAL.

   buf
       IPC_STAT/IPC_SET.  
   ,   .

   array
        GETALL/SETALL.    ,
        

                                - 60 -

.

       __buf  __pad    
,        .  
   LINUX-,      UNIX-.

            
     System V IPC,  
    .

          . 
 () ,    GETVAL.

int get_sem_val( int sid, int semnum )
{
   return( semctl(sid, semnum, GETVAL, 0));
}

         , ,  
    :

#define MAX_PRINTERS 5

printer_usage()
{
   int x;

   for(x=0; xsem_perm.mode);

   /*      */
   sscanf(mode, "%0", &semopts.buf->sem_perm.mode);

   /*     */
   semctl(sid, 0, IPC_SET, semopts);

   printf("Updated...\n");

                                - 62 -

}
           
   ,     IPC_SET
   . ,   semctl-  
EFAULT       (!).
 ,          , 
   . ?

     ,   IPC_SET/IPC_STAT   buf
,      semid_ds.  -
 ,    !  buf  
    ,     
.   :

void changemode(int sid, char *mode)
{
   int rc;
   struct semid_ds mysemds;

   /*        */

   /*      ! */
   semopts.buf = &mysemds;

   /*   ! */
   if((rc = semctl(sid, 0, IPC_STAT, semopts)) == -1)
   {
      perror("semctl");
      exit(1);
   }

   printf("Old permissions were %o\n", semopts.buf->sem_perm.mode);

   /*      */
   sscanf(mode, "%0", &semopts.buf->sem_perm.mode);

   /*     */
   semctl(sid, 0, IPC_SET, semopts);

                                - 63 -


   printf("Updated...\n");
}

     semtool:      

     

      semtool()-     , 
     shell-.   , 
,         
  .     
     shell-.

       

       
     semtool c (   )

      
     semtool l (   )

      
     semtool u (   )

        (mode)
     semtool m (mode)

       
     semtool d

              

   semtool c 5
   semtool l
   semtool u
   semtool m 660
   semtool d

                                - 64 -


               

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: semtool.c
 ****************************************************************************
           SysV
 ****************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include #define SEM_RESOURCE_MAX    1
/*      */

void opensem(int *sid, key_t key);
void createsem(int *sid, key_t key, int members);
void locksem(int sid, int member);
void unlocksem(int sid, int member);
void removesem(int sid);
unsigned short get_member_count(int sid);
int getval(int sid, int member);
void dispval(int sid, int member);
void changemode(int sid, char *mode);
void usage(void);

int main(int argc, char *argv[])
{
   key_t key;
   int semset_id;

   if(argc ==1)
      usage();

                                - 65 -


   /*      ftok() */
   key = ftok(".", 's');

   switch(tolower(argv[1][0]))
   {
      case 'c': if(argc != 3)
                   usage();
                createsem(&semset_id, key, atoi(argv[2]));
                break;
      case 'l': if(argc != 3)
                   usage();
                opensem(&semset_id, key);
                locksem(semset_id, atoi(argv[2]));
                break;
      case 'u': if(argc != 3)
                   usage();
                opensem(&semset_id, key);
                unlocksem(semset_id, atoi(argv[2]));
                break;
      case 'd': opensem(&semset_id, key);
                removesem(semset_id);
                break;
      case 'm': opensem(&semset_id, key);
                changemode(semset_id, argv[2]);
                break;      default: usage();

   }

   return(0);
}

void opensem(int *sid, key_t key)
{
   /*    -  ! */

   if((*sid = semget(key, 0, 0666)) == -1)
   {

                                - 66 -

      printf("Semaphore set does not exist!\n");
      exit(1);
   }

}

void createsem(int *sid, key_t key, int members)
{
   int cntr;
   union semun semopts;

   if(members > SEMMSL) {
      printf("Sorry, max number of semaphores in a set is %d\n",
              SEMMSL);
      exit(1);
   }

   printf("Attempting to create new semaphore set with %d members\n",
           members);

   if((*sid = semget(key, members, IPC_CREAT|IPC_EXCL|0666)) == -1)
   {
      fprintf(stderr, "Semaphore set already exists!\n");
      exit(1);
   }
   semopts.val = SEM_RESOURCE_MAX;

   /*    (    SETALL) */
   for(cntr=0; cntr(get_member_count(sid)-1))
   {
      fprintf(stderr, "semaphore member %d out of range\n", member);
      return;

                                - 67 -

   }

   /*     */
   if(!getval(sid, member))
   {
      fprintf(stderr, "Semaphore resources exhausted (no lock)!\n");
      exit(1);
   }

   sem_lock.sem_num = member;

   if((semop(sid, &sem_lock, 1)) == -1)
   {
      fprintf(stderr, "Lock failed\n");
      exit(1);
   }
   else
      printf("Semaphore resources decremented by one (locked)\n");

   dispval(sid, member);
}

void unlocksem(int sid, int member)
{
   struct sembuf sem_unlock={ member, 1, IPC_NOWAIT };
   int semval;

   if( member<0 || member>(get_member_count(sid)-1))
   {
      fprintf(stderr, "semaphore member %d out of range\n", member);
      return;
   }

   /*    ? */
   semval = getval(sid, member);
   if(semval == SEM_RESOURCE_MAX) {
      fprintf(stderr, "Semaphore not locked!\n");
      exit(1);

                                - 68 -

   }
   sem_unlock.sem_num = member;

   /*     */
   if((semop(sid, &sem_unlock, 1)) == -1)
   {
      fprintf(stderr, "Unlock failed\n");
      exit(1);
   }
   else
      printf("Semaphore resources incremented by one (unlocked)\n");

   dispval(sid, member);
}

void removesem(int sid)
{
   semctl(sid, 0, IPC_RMID, 0);
   printf("Semaphore removed\n");
}

unsigned short get_member_count(int sid)
{
   union semun semopts;
   struct semid_ds mysemds;

   semopts.buf = &mysemds;

   /*       */
   return(semopts.buf->sem_nsems);
}

int getval(int sid, int member)
{
   int semval;

   semval = semctl(sid, member, GETVAL, 0);
   return(semval);

                                - 69 -

}

void changemode(int sid, char *mode)
{
   int rc;
   union semun semopts;
   struct semid_ds mysemds;

   /*        */
   semopts.buf = &mysemds;

   rc = semctl(sid, 0, IPC_STAT, semopts);

   if (rc == -1) {
      perror("semctl");
      exit(1);
   }

   printf("Old permissions were %o\n", semopts.buf->sem_perm.mode);

   /*      */
   sscanf(mode, "%ho", &semopts.buf->sem_perm.mode);

   /*     */
   semctl(sid, 0, IPC_SET, semopts);

   printf("Updated...\n");

}

void dispval(int sid, int member)
{
   int semval:

   semval = semctl(sid, member, GETVAL, 0);
   printf("semval for member %d is %d\n", member, semval);
}


                                - 70 -

void usage(void)
{
   fprintf(stderr, "semtool - A utility for tinkering with semaphores\n");
   fprintf(stderr, "\nUSAGE: semtool4 (c)reate \n");
   fprintf(stderr, "                (l)ock \n");
   fprintf(stderr, "                (u)nlock \n");
   fprintf(stderr, "                (d)elete\n");
   fprintf(stderr, "                (m)ode \n");
   exit(1);
}

     semstat: -  semtool

        semtool,   
- semstat.       
 ,   semtool.

/****************************************************************************
 Excerpt from "Linux Programmer's Guide - Chapter 6"
 (C)opyright 1994-1995, Scott Burkett
 ****************************************************************************
 MODULE: semstat.c
 ****************************************************************************
   c   semtool-. Semstat   
     ,   semtool.
 ****************************************************************************/

#include 
#include 
#include 
#include 
#include 

int get_sem_count(int sid);
void show_sem_usage(int sid);
int get_sem_count(int sid);
void dispval(int sid);


                                - 71 -

int main(int argc, char *argv[])
{
   key_t key;
   int semset_id;

   /*      ftok() */
   key = ftok(".", 's');

   /*    -  ! */
   if((semset_id = semget(key, 1, 0666)) == -1)
   {
      printf("Semaphore set does not exist!\n");
      exit(1);
   }

   show_sem_usage(semset_id);
   return(0);
}

void show_sem_usage(int sid)
{
   int cntr=0, maxsems, semval;

   maxsems = get_sem_count(sid);

   while(cntr < maxsems) {      semval = semctl(sid, cntr, GETVAL, 0);
      printf("Semaphore #%d: --> %d\n", cntr, semval);
      cntr++;
   }
}

int get_sem_count(int sid)
{
   int rc;
   struct semid_ds mysemds;
   union semun semopts;

   /*        */

                                - 72 -

   semopts.buf = &mysemds;

   if((rc = semctl(sid, 0, IPCJ_STAT, semopts)) == -1) {
      perror("semctl");
      exit(1);
   }

   /*      */
   return(semopts.buf->sem_nsems);
}

void dispval(int sid)
{
   int semval;

   semval = semctl(sid, 0, GETVAL, 0);
   printf("semval is %d\n", semval);
}

     6.4.4.  

      

            
  () ,    
   .      IPC, 
     (.. , 
  ..).  ,  
       
.        
  /   .

         

         ,  , 
  .



                                - 73 -

       shmid_ds

      ,       , 
      
  ,     
.     shmid_ds   
Linux/shm.h  :

   /*   shmid     
       */
   struct shmid_ds {
      struct ipc_perm shm_perm;         /*   */
      int    shm_segsz;                 /*   ( ) */
      time_t shm_atime;                 /*    */
      time_t shm_dtime;                 /*    */
      time_t shm_ctime;                 /*    */
      unsigned short shm_cpid;          /* pid  */
      unsigned short shm_lpid;          /* pid  
                                            */
      short  shm_nattch;                /*    */

                                        /*     */

      unsigned short shm_npages;        /*   ( ) */
      unsigned long *shm_pages;         /*    $frames -> S$ */
      struct vm_area_struct *attaches;  /*    */
};

          
        . 
 ,    :

   shm_perm
        ipc_perm,    Linux/ipc.h.
      ,    
    (uid  ..).



                                - 74 -

   shm_segsz
       ( ).

   shm_atime
         .

   shm_dtime
          .

   shm_ctime
          ( mode  ..).

   shm_cpid
     PID  .

   shm_lpid
     PID     .

   shm_nattch
      ,      .

       shmget()

            
   ,    shmget().

SYSTEM CALL: shmget();

PROTOTYPE: int shmget ( key_t key, int size, int shmflg );
   RETURNS:       
            -1   :
               errno = EINVAL (   )
                       EEXIST ( ,  )
                       EIDRM (   ,   )
                       ENOENT (  )
                       EACCESS ( )
                       ENOMEM (    )


                                - 75 -

NOTES:

              
.       get 
    .

        shmget() -    (  
   ftok()-).    
   ,    
    .    
        shmflg.

   IPC_CREAT
      ,       .

   IPC_EXCL
         IPC_CREAT   , 
  .

        IPC_CREAT,  shmget()  
    ,   
,        .  
 IPC_CREAT  IPC_EXCL,     ,
,    ,  ""  -1.
IPC_EXCL    ,      IPC_CREAT,
       ,   
 ,   .

     , ()    
     .

       -    
  :
int open_segment( key_t keyval, int segsize )
{
   int shmid;

   if((shmid = shmget( keyval, segsize, IPC_CREAT | 0660 )) == -1)

                                - 76 -

   {
      return(-1);
   }

   return(shmid);
}

        0660   .  
       (int),
 -1   .      
( )    .

           IPC 
 ,      
    .

       shmat()

SYSTEM CALL: shmat();

PROTOTYPE: int shmat ( int shmid, char *shmaddr, int shmflg );
   RETURNS: ,       ,  
            
            -1   :
               errno = EINVAL (  IPC ID   )
                       ENOMEM (    )
                       EACCES ( )
NOTES:

       addr  ,   
 .   .   
,        
       
.  SHM_RND   OR-   , 
      ( 
 ).



                                - 77 -

      ,    SHM_RDONLY,  
   ,   readonly.

      , ,    . 
-,     
   :

char *attach_segment( int shmid )
{
   return(shmat(shmid, 0, 0));
}

         ,     
 ,        
,   .   
 !         ()
.

       shmctl()

SYSTEM SALL: shmctl();
PROTOTYPE: int shmctl ( int shmqid, int cmd, struct shmid_ds *buf );
   RETURNS: 0   
            -1   :
               errno =
     EACCESS (     cmd,  IPC_STAT)

     EFAULT (,    ,   cmd,
 IPC_SET  IPC_STAT)

     EIDRM (     )

     EINVAL ( shmqid)

     EPERM (   IPC_SET  IPC_RMID 
       (  ))



                                - 78 -

NOTES:

         msgctl(),    
 .       
.    :

   IPC_STAT
       shmid_ds       ,
 buf-.

   IPC_SET
       ipc_perm-  shmid_ds. 
    buf.

   IPC_RMID
        .

     IPC_RMID       ,  
  .     , 
 ,   ,  ""   
. ,         
 ,   .

          shmdt.

       shmdt()

SYSTEM SALL: shmdt();
PROTOTYPE: int shmdt ( char *shmaddr );
   RETURNS: -1   :
     errno = EINVAL (   )  , 
      ,   
  shmdt().   ,     ,
    .    
 shm_nattch  shmid_ds   1.  
 0,    .



                                - 79 -

     shmtool:     

     

         System V IPC -  shmtool:
    , ,   
  .  ,     , 
     ,    
.

       

      
     shmtool w "text"

      
     shmtool r

      (mode)
     shmtool m (mode)

    
     shmtool d

              

   shmtool  w  test
   shmtool  w  "This is a test"
   shmtool  r
   shmtool  d
   shmtool  m  660

              

#include 
#include 
#include 
#include 

                                - 80 -


#define SEGSIZE 100main(int argc, char *argv[])
{
   key_t key;
   int shmid, cntr;
   char *segptr;

   if(argc == 1)
      usage();

   /*      ftok() */
   key = ftok(".", 'S');

   /*     -  ,  */
   if((shmid = shmget(key, SEGSIZE, IPC_CREAT|IPC_EXCL|0660)) == -1)
   {
      printf("Shared memory segment exists - opening as a client\n");

      /*  ,    -    */
      if((shmid = shmget(key, SEGSIZE, 0)) == -1)
      {
         perror("shmget");
         exit(1);
      }
   }
   else
   {
      printf("Creating new shared memory segment\n");
   }

   /*  ()     
       */
   if((segptr = shmat(shmid, 0, 0)) == -1)
   {
      perror("shmat");
      exit(1);
   }


                                - 81 -

   switch(tolower(argv[1][0]))
   {
      case 'w': writeshm(shmid, segptr, argv[2]);
                break;
      case 'r': readshm(shmid, segptr);
                break;
      case 'd': removeshm(shmid);
                break;
      case 'm': changemode(shmid, argv[2]);
                break;
      default: usage();

   }
}

writeshm(int shmid, char *segptr, char *text)
{
   strcpy(segptr, text);
   printf("Done...\n");
}

readshm(int shmid, char *segptr)
{
   printf("segptr: %\n", segptr);
}

removeshm(int shmid)
{
   shmctl(shmid, IPC_RMID, 0);
   printf("Shared memory segment marked for deletion\n");
}

changemode(int shmid, char *mode)
{
   struct shmid_ds myshmds;

   /*         myshmds */
   shmctl(shmid, IPC_STAT, &myshmds);

                                - 82 -


   /*       */
   printf("Old permissions were: %o\n", myshmds.shm_perm.mode);

   /*       */
   sscanf(mode, "%o", &myshmds.shm_perm.mode);

   /*      */
   shmctl(shmid, IPC_SET, &myshmds);

   printf("New permissions are: %o\n", myshmds.shm_perm.mode);
}

usage()
{
   fprintf(stderr, "shmtool - A utility for tinkering with shared memory\n");
   fprintf(stderr, "\nUSAGE: shmtool (w)rite \n");
   fprintf(stderr, "                 (r)ead\n");
   fprintf(stderr, "                 (d)elete\n");
   exit(1);   fprintf(stderr, "             (m)ode change \n");
   exit(1);
}

     7.  

           : 
 (PC speaker).       
 ,     (. Linux
Sound User's Guide  Sound-HOWTO    ).

     7.1.   

       -    Linux ,  
 .  ,   ioctl 
  .       :




                                - 83 -

   1. KDMKTONE
       beep  ,  
. , ioctl(fd, KDMKTONE, (long) argument).

   2. KIOCSOUND
       beep     
. , ioctl(fd, KIOCSOUND, (int) tone).

             
    .  -   .  8254 
    1.19     -  1190000/.
    .    ,
     ,   .
  
     KDMKTONE     ,
       .

       KIOCSOUND   ,  
    splay.   
    0.

     7.2.   

           ,  
Linux-    .    -
 /dev/sndstat.   /dev/sndstat  
 errno = ENODEV,   ,      
,         
.        /dev/dsp,  
    pcsnd.

              ,
,    outb()  inb()  
,   .

     ,   ,  
   i386 ,    
     Linux, isc, FreeBSD  

                                - 84 -

 i386 .   -     Linux,
  .     
:

     *   /

     *   

     * midi 

           . 
   /dev/dsp,    - /dev/sequencer,
 midi  - /dev/midi.   (volume, balance,
bass)   /dev/mixer .   
  /dev/audio,    -low
    .

       ,  ,    ioctl() 
   .  ioctl()  
    SNDCTL_.

          ,   
-  .

     8.  

          /   .  
 "",    ,  
       (charset).
           
    (charset) ,   
 ,   .  
 ,       .
,    , 
  Linux-,   Linux-.




                                - 85 -

   * printf, sprintf, fprintf, scanf, sscanf, fscanf
        libc     
 stdout ( ),  stderr ( )  
,   FILE *stream (, ). sscanf
       
stdin.

   * termcap
       TERMinal CAPabilitie -    
    ASCII- /etc/termcap.    
  ,    ,  
 (,      ..)  
 .   , ,
 vi.       
  ( termcap(3x)).    
         
.   termcap     
   .    ,
     .

   *   terminfo
       TERMinal INFOrmation    
termcap        
.  terminfo      ,
  ,      .
       /usr/lib/terminfo/[A-z,0-9]*.
    .

   * curses
     Terminfo -        .
 (BSD-)curses      ,
  terminfo. curses    
  ,     
/     -
    150 .   
/usr/lib/libcurses.a.  BSD- curses.



                                - 86 -

   * ncurses
     ncurses -   curses.   1.8.6   
  AT&T curses,     SYSVR4,  
 ,    , 
  , ,   ,  .
ncurses     ,   Sun-OS, HP
 Linux.    ncurses  . 
SYSV Unix  (, Solaris)   
curses     ,   ncurses (
   curses     
 ).

         ,   
   .  Linux-   GNU- termcap 
  ncurses  curses.

     8.1.  /  libc

     8.1.1.  

      printf(...)  libc    
  .

* int fprintf(FILE *stream, const char *format, ...),
       
   stream.    format.
        
 .

     format    :    ,
    .

          %,   
  ,      (
  %,  %%).    
:



                                - 87 -

  - 
     * -
             
.
     * +
          , , +12  -2.32.

  - 
        -  ,    .

  - 0
            .

  - #
            :
       *  o    0.
       *  x  X     0x  0X .
       *  e, E, f, F    .
       *  g  G      .

  - ,    
         ,   
,   .       
.   ,     
  .

  -       

  -   

            8.1.

   * int printf(const char *format, ...)
       ,  fprintf(stdout, ...).

   * int sprintf(char *s, const char *format, ...)
      ,   printf(...),      
 s (  \0). (    

                                - 88 -

 s.)

   * vprintf(const char *format, va_list arg)
vfprintf(FILE *stream, const char *format, va_list arg)
vsprintf(char *s, const char *format, va_list arg)
      ,     ,   
  arg.

     8.1.2.  

       ,  printf(...)   , 
  scanf(...)   .

   * int fscanf(FILE *stream, const char *format, ...)
     fscanf(...)   stream     ,
  format.    ,  
"..." (    !).  ,
  format   .

      8.1: Libc -  printf

     |          
   --------|-----------------------------------
     d,i   |  int signed, 
      o    |  int unsigned, ,   0
     x,X   |  int unsigned, ,   0x
      u    |  int unsigned, 
      c    |  int (unsigned)  
      s    |  char *  \0
      f    |  double  [-]mmm.ddd
     e,E   |  double  [-]m.dddddde+xx, [-]m.dddddde-xx
     g,G   |  double  %e  %f  
      p    |  void *
      n    |  int *
      %    |  %

     fscanf  EOF,       
 .    ,   

                                - 89 -

 .

     format      (.
. 8.2)
        :

      -   ,  ;

      -   ,  %.     
          .

      -  ,   %,   *
        ( fscanf(...)  ), 
        ,   h, l  L (  
         )   .

   * int scanf(const char *format, ...)
 ,  fscanf(stdin,...)

   * int sscanf(char *str, const char *format, ...)
 ,  scanf,      str.

     8.2.  termcap

     8.2.1. 

      termcap -  API    termcap, 
  /etc/termcap/.   :

     *    : tgetent(...);









                                - 90 -

               8.2: libc -  sanf

   |  -  
  -------|---------------------------------------------------------------
    d    |  integer - int*
    i    | integer - int* (   -  )
    o    |  integer - int* (    0)
    u    |  unsigned - unsigned int*
    x    |  integer - int* (    0x)
    c    |     - char* (  /0)
  e,f,gf | float - float* (  [-]m.dddddde+xx, [-]m.dddddde-xx)
    p    |  - void*
    n    |    - int*
  [...]  |      - char*
  [^...] |    - char*
    %    | %
  -----------------------------------------------------------------------
   d,i,n,o,u,x   h,   - short
     l,   - long
  l     e,f,g,   - double
  L    e,f,g,   - long double

  *    : tgetnum(...), tgetflag(...),
tgetstr(...);

  *     : tputs()

     ,   termcap  
termcap.h   :

   gcc [flags] files -ltermcap

      termcap - ,  
     .  
    curses  ncurses.




                                - 91 -

     8.2.2.   

   * int tgetent(void *buffer, const char *termtype)
        Linux     
  TERM.  termtype   
getenv(3).   buffer,   GNU- Linux termcap  
 .       2048 
( buffer  1024 ,    ).

     tgetent(...)  1     0   
,       TERM.   
 .

          getent(...):

#define buffer 0
char *termtype=getenv("TERM");
int ok;

ok=tgetent(buffer,termtype);
if(ok==1)
   /*  ,    */
else if(ok==0)
   /* , -    TERM
    *   termtype,    termcap
    */
else
   /* --,   */

       termcap  /etc/termcap/   .
   TERMCAP , , 
$HOME/mytermcap,      mytermcap 
/etc/termcap.     TERMCAP  
    .





                                - 92 -

     8.2.3.  

          (capability).
  -   ,    
  .    .

     * : , co -  

     *   : , hc -   
(hardcopy terminal)

     * : , st -   ( .
8.22.3)

            (co 
, hc  ,  st  ).    - 
  ,  . char *name -   
.

   * int tgetnum(char *name)
         ,   co. 
tgetnum(...)   ,   , 1 
 . (,    
.)

   * int tgetflag(char *name)
       .  1,  
, 0   .

   * char *tgetstr(char *name, char **area)
       .     
NULL   .  GNU-,  area  NULL, termcap
  . termcap      ,
    name    .  
,        
,   termcap    .



                                - 93 -

char *clstr, *cmstr;
int lines, cols;

void term_caps()
{
char *tmp;

 clstr=tgetstr("cl",0); /*   */
 cmstr=tgetstr("cm",0); /*  y,x */

 lines=tgetnum("li"); /*   */
 cols=tgetnum("co"); /*   */

 tmp=tgetstr("pc",0); /*   */

 PC=tmp ? *tmp : 0;
 BC=tgetstr("le",0); /*      */
 UP=tgetstr("up",0); /*      */
}

     8.2.4.  termcap

      

5i      
am  ,   
    
bs Crtl-H  backspace
bw backspace        
   
da     
db     
eo      
es esc-      
   
gn  
hc     (hardcopy terminal)
HC   ,      

                                - 94 -

hs   
hz      (tilde characters)
in        
km    
mi    
ms    /   
NP  -
NR ti   teos    
ul  ,     
xb ,  , F1  ESCAPE, F2  ^C
xn    /  
xo   xon/xoff 
xs ,   ,  
xt   ,     
   

      

co  
dB        
   
dC        
    
dF        
    
dN         
   
dT         
   
dV        
    
it    
lh   
lm  
lw 
li  
Nl   
pb  ,   

                                - 95 -

sg   
ug   
vt   
ws   ,      

               

!1     
!2     
!3  undo   
#1     
#2  home   
#3     
#4   -    
%0  redo
%1  
%2  
%3  
%4  
%5   
%6  
%7  
%8   
%9  
%a      
%b     
%c      
%d      
%e      
%f     
%g  redo   
%h     
%i  -   
%j     
&0  cancel   
&1  
&2  
&3  

                                - 96 -

&4  
&5  
&6  
&7  
&8  undo
&9     
*0     
*1     
*2     
*3      
*4      
*5      
*6  
*7     
*8      
*9     
 0  1  
2  cancel
3  
4  
5  
6  
7  
8  /
9  
al    
AL   %1 
ac   ,     
ae      
as      
bc backspace,   ^H
bl  
bt     
cb      
cc   
cd    
ce    
ch      %1

                                - 97 -

cl  ,    
cm     %1   %2 ( )
CM     %1   %2 ( )
cr  
cs     %1   %2
ct  
cv      %1
dc  1 
DC  %1 
dl  1 
DL  %1 
dm   
do   1  
DO   %1  
ds   
eA    
ec  %1     
ed   
ei   
ff       
fs          
F1     F11
... ...
F9     F19
FA     F20
... ...
FZ     F45
Fa     F46
... ...
Fr     F63
hd    - 
ho   
hu    - 
i1   1   
i3   3   
is   2   
ic  1 
IC  %1 

                                - 98 -

if  
im   
ip        
iP  
K1     keypad
K2    keypad
K3     keypad
K4     keypad
K5     keypad
k0   0
... ...
k9   9
k;   10
ka    
kA   
kb  backspace
kB      
kC   
kd  down
kD     
ke  keypad
kE     
kh   - home
kH   home + down
kI   /   
kl   - left
kL   
kM M    
kN   
kP   
kr   - right
kR   /
ks  keypad
kS     
kt    
kT      
ku   - up
l0     ,   f0

                                - 99 -

l1     ,   f1
l2     ,   f2
...
la     ,   f10
le    1 
ll      
LE    %1 
LF   
LO   
mb  
MC   
md    
me     so, us, mb, md, mr
mh   
mk    (  )
ML    
mm    
mo    
mp   
mr    (reverse mode)
MR    
nd   1  
nw   
pc -
pf  
pk   %1    %2,   
pl   %1    %2   
pn    %1    %2
po  
pO    %1 (<256) 
ps     
px   %1    %2  
r1   1,   
r2   2,   
r3   3,   
RA   
rc    
rf    

                               - 100 -

RF    
RI    %1 
rp   %1 %2 
rP       
rs  
RX  XON/XOFF 
sa   %1 %2 %3 %4 %5 %6 %7 %8 %9
SA   
sc   
se    
sf     
SF    %1 
so    
sr  
SR    %1 
st        
SX  XON/XOFF 
ta      
tc        
te  ,   
ti  ,   
ts     %1  
uc        
ue  
up   1  
UP   %1  
us  
vb  
ve   
vi  
vs   
wi     %1   %2    %3  %4
XF  XOFF,   ^S






                               - 101 -

     8.3.   ncurses

           .

     *  (window) -  , 
  . WINDOW   ncurses.h.

     *  (screen) -       ( 
    ).   stdscr  curscr.

     *  (terminal) -      ,
     .

     *  -    ,  
ncurses.h:

      - WINDOW *curscr -  
      - WINDOW *stdscr -  
      - int LINES -   
      - int COLS -   
      - bool TRUE -  , 1
      - bool FALSE -  , 0
      - int ERR -  , -1
      - int OK -  ok, 0

     *  -       :

      - win - WINDOW*
      - bf - bool
      - ch - chtype
      - str - char*
      - chstr - chtype*
      - fmt - char*
      -  int





                               - 102 -

      ,  ncurses,  :

#include 
...
main()
{
   ...
   initscr();
   /*   ncurses */
   endwin();
   ...
}

      ncurses.h      ncurses,
  WINDOW,   .  
stdio.h, stdarg.h, termios.h, unctrl.h.

     initscr()      ncurses
    terminfo.     stdscr 
curscr.   ,  initscr  ERR.  
    stdscr.  ,  
    LINES  COLS.

     endwin()     ncurses  
 tty,      initscr().  endwin()
        ncurses 
    .     
    ,  newterm(...) 
initscr().

       :

gcc [flags] files -lncurses

          (. gcc(1)).   
ncurses.h ,     , 
ncurses.h, nterm.h, termcap.h  unctrl.h   :


                               - 103 -

-I/usr/include/ncurses

        Linux- : -O2 -ansi -Wall -m486. O2
 gcc   ; -ansi -  ANSI -;
-Wall   ; -m486    Intel 486
(   Intel 386).

      ncurses   /usr/lib/.  3 
:
   * libncurses.a -  ncurses
   * libdcurses.a - ncurses  
   * libpcurses.a - ncurses   (  -
 1.8.6libcurses.a?)
   * libcurses.a -   ,   BSD curses

          windows   
ncurses.h.  -       , 
      .  
newwin(...)     .

         , ncurses 
 , curscr.  ,    . 
 stdscr     refresh(). 
 ncurses  curscr     stdscr.
      
,         
    .

      ncurses       window.
,   w,    window,  
     stdscr. ,   mv,
      y,x.

        chtype,   long unsigned int,
      (  ..).

      ncurses    terminfo.  
  usr/lib/terminfo/,  ncurses    

                               - 104 -

 .      
  ,    terminfo,
    TERMINFO.  
  ncurses,   usr/lib/terminfo/ 
 .

       ncurses  1.8.6.

              BSD-Curses,
ncurses  Sun-OS 5.4 curses.

     8.4. 

   * WINDOW *initscr()
        ,   , 
ncurses.      slk_init(int), filter(),
ripoffline(...)  use_env(bf)  initscr().   
  (   ) 
  newterm(...)  initscr(). initscr() 
terminfo      ncurses,   
curscr  stdscr    LINES  COLS
,   .  
  stdscr  ERR   .   
 .

stdscr=initscr();

      initscr()    .   ERR, 
  ,     ncurses 
 :

if(!(initscr())){
   fprintf(stderr,"type: initscr() failed\n\n");
   exit (1);
}




                               - 105 -

   * SCREEN *newterm(char *type, FILE *outfd, FILE *infd)
       ncurses   ,   
    newterm(...)  initscr(). type -  
     $TERM (ansi, xterm, vt100, );
outfd -    , infd -   . 
 ,  newterm(...),   endwin().

   * SCREEN *set_term(SCREEN *new)
       set_term(SCREEN)    
.       ,
 set_term(SCREEN).

   * int endwin()
     endwin()  ,   ,
   initscr(),      
 .       ,  
endwin(),     .  
refresh()  endwin()   ,
   initscr() (visual-mode),   
   (non-visual-mode).

   * int isendwin()
      TRUE,   endwin()   refresh(),
 - FALSE.

   * void delscreen(SCREEN *sp)
       endwin()    
,  SCREEN   . (  .)

     8.5. 

        , , , ,
  ..

   * WINDOW *newwin(nlines, ncols, begy, begx)
     begy  begx -     . nlines - 
  (integer); ncols -   (integer).


                               - 106 -

WINDOW *mywin;
mywin=newwin(10,60,10,10);

             10  
10;   10   60 .  nlines  , 
  (LINES - begy) .   ,  ncols  ,
    (COLS - begx) .   
newwin(...)   :

WINDOW *mywin;
mywin=newwin(0,0,0,0);

         .

       LINES  COLS       ,
     :

      0      begx
       |       |
0      |       |                            COLS
- - - - -------|-------------------------|------->
       |       |     ncols               |
 begy  |       |<. . . . . . . . . . . .>|
- - - -|- - - -|-------------------------|
       |      ^|                         |
       |      .|                         |
       |      .|                         |
       |nlines.| newwin(nlines, ncols,   |
       |      .|        begy, begx)      |
       |      v|                         |
       |- - - -|-------------------------|
 LINES |
       v

#define MYLINE (int) ((LINES-22)/2)
#define MYCOL ((COLS-70)/2)
#define MYLINES 22
#define MYCOLS 70

                               - 107 -

...
WINDOW *win;
...
if(!(initscr())){
   fprintf(stderr, "type: iniscr() failed\n\n");
   exit(1);
}
...
if ((LINES<22)||(COLS<70)){
   fprintf(stderr, "screen too small\n\n");
   endwin(); exit (1);
}
win=newwin(MYLINES,MYCOLS,MYLINE,MYCOL);
...

        22   70    .
    ,   .  Linux-
   25   80 ,   x-   
 (  ).

       ,  LINES  COLS,   
   :

#define MYROWS   (int) (LINES/2+LINES/4)
#define MYCOLS   (int) (COLS/2+COLS/4)
#define LEFTROW  (int) ((LINES-MYROWS)/2)
#define LEFTCOL  (int) (((COLS-2)-MYCOLS)/2)
#define RIGHTROW (int) (LEFTROW)
#define RIGHTCOL (int) (LEFTROW+2+MYCOLS)
#define WCOLS    (int) (MYCOLS/2)
...
WINDOW *leftwin, *rightwin;
...
leftwin=newwin(MYROWS, WCOLS, LEFTROW, LEFTCOL);
rightwin=newwin(MYROWS, WCOLS, RIGHTROW, RIGHTCOL);
...



                               - 108 -

       screen.c    .

   * int delwin(win)
       win.  win   win. 
  ,  win.     
  endwin().

   * int mvwin(win, by, bx)
         by,bx.     
 ,        ERR.

   * WINDOW *subwin(origwin, nlines, ncols, begy, begx)
         origwin-.    
   (origwin  ),     
.  touchwin(origwin)   refresh().

     begx  begy    origwin,   .

   * WINDOW *derwin(origwin, nlines, ncols, begy, begx)
      ,  subwin(), begx  begy    ,  
origwin.

   * int mvderwin(win, y, x)
      win    . ( 
.)

   * WINDOW *dupwin(win)
       win.

   * int syncok(win, bf)
     void wsyncup(win)
     void wcursyncup(win)
     void wsyncdown(win)
(  .)





                               - 109 -

   * int overlay(win1, win2)
     int overwrite(win1, win2)
     overlay(...)     win1  win2, 
. overwrite(...)    ,    
.

   * int copywin(win1, win2, sminrow, smincol, dminrow, dmincol, dmaxrow,
                 dmaxcol, overlay)
      ,  overlay(...)  overwrite(...),  
    .

     8.6. 

   * int addch(ch)
     int waddch(win, ch)
     int mvaddch(y, x, ch)
     int mvwaddch(win, y, x, ch)
          .    ; 
  refresh(),     . 
addch(...)  waddch(...)   ch   stdscr  win.
mvaddch(...)  mvwaddch(...)     
y,x.

   * int addstr(str)
     int addnstr(str, n)
     int waddstr(win, str)
     int waddnstr(win, str, n)
     int mvaddstr(y, x, str)
     int mvaddnstr(y, x, str, n)
     int mvwaddstr(win, y, x, str)
     int mvwaddnstr(win, y, x, str, n)
              
addch(...). str -  ,     0
("\0"). ,   w,  str   win,
 -  stdscr.   n  n   str.  n
 -1,    .



                               - 110 -

   * int addchstr(chstr)
     int addchnstr(chstr, n)
     int waddchstr(win, chstr)
     int waddchnstr(win, chstr, n)
     int mvaddchstr(y, x, chstr)
     int mvaddchnstr(y, x, chstr, n)
     int mvwaddchstr(win, y, x, chstr)
     int mvwaddchnstr(win, y, x, chstr, n)
        chstr   stdscr  win. 
   .   n  n  
chstr.  n  -1,    .   
   .   ,  addstr(...).
chstr      chtype.

   * int echochar(ch)
     int wechochar(win, ch)
      ,  addch(...), waddch(win),   refresh(),
wrefresh(win).

     8.6.1.  

   * int printw(fmt, ...)
     int wprintw(win, fmt, ...)
     int mvprintw(y, x, fmt, ...)
     int mvwprintw(win, y, x, fmt, ...)
     int vwprintw(win, fmt, va_list)
        printf(...)    
libc.  libc printf(...)    . 
        
 .    8.1.1.

   vwprintw(...)   varargs.h.







                               - 111 -

     8.6.2.    

   * int insch(c)
     int winsch(win, c)
     int mvinsch(y, x, c)
     int mvwinsch(win, y, x, c)
      ch    ,    
   .       .

   * int insertln()
     int winsertln(win)
         .   
.

   * int insdelln(n)
     int winsdelln(win, n)
       n    n  
  (n    ). 
 n   n   , 
 .

   * int insstr(str)
     int insnstr(str, n)
     int winsstr(win, str)
     int winsnstr(win, str, n)
     int mvinsstr(y, x, str)
     int mvinsnstr(y, x, str, n)
     int mvwinsstr(win, y, x, str)
     int mvwinsnstr(win, y, x, str, n)
        str      
(    ).    
      .  
 . y  x - ,     
 str; n -     (n=0  
).




                               - 112 -

     8.6.3.    

   * int delch()
     int wdelch(win)
     int mvdelch(y, x)
     int mvwdelch(win, y, x)
             
     .

     y  x - ,     
.

   * int deleteln()
     int wdeleteln(win)
             
  .     .

     8.6.4.   

   * int border(ls, rs, ts, bs, tl, tr, bl, br)
     int wborder(win, ls, rs, ts, bs, tl, tr, bl, br)
     int box(win, vert, hor)
        (stdscr  win).   8.3
         box(...). 
      .

   * int vline(ch, n)
     int wvline(win, ch, n)
     int hline(ch, n)
     int whline(win, ch, n)
           
   . ch -   , n - 
 .    .






                               - 113 -

     8.6.5.  (background) 

   * void bkgdset(ch)
     void wbkgdset(win, ch)
             .
  ch  OR-     . 
         /.

               8.3: ncurses -  

 |               |  
-------|----------------------|----------------------
  tl   |          | ACS_ULCORNER
  ts   |        | ACS_HLINE
  tr   |         | ACS_URCORNER
  ls   |          | ACS_VLINE
  rs   |         | ACS_VLINE
  bl   |           | ACS_LLCORNER
  bs   |         | ACS_HLINE
  br   |          | ACS_LRCORNER
  rt   |         | ACS_RTEE
  lt   |          | ACS_LTEE
  tt   |        | ACS_TTEE
  bt   |         | ACS_BTEE















                               - 114 -

               8.2: ncurses -  

         tl      ts    tt     ts      tr
           |------------|------------|
           |                         |
         ls|            |            |rs
           |                         |
           |            |            |
         lt|- - - - - - - - - - - - -|rt
           |            |            |
           |                         |
         ls|            |            |rs
           |                         |
           |------------|------------|
         bl      bs    bt     bs      br
   * int bkgd(ch)
     int wbkgd(win, ch)
  ch    .

     8.7. 

   * int getch()
     int wgetch(win)
     int mvgetch(y, x)
     int mvwgetch(win, y, x)
     getch()    .    ,
getch()    .   -   
   ERR,   . mvgetch(...)  mvwgetch(...)
     y,x. w-   
,    win, getch()  mvgetch(...) -  stdscr.

       keypad(...)    
getch()  ,   ncurses.h   KEY_*. 
 ESCAPE (     )
ncurses   .     
  ,   ESCAPE,  - 
 .     
  notimeout().

                               - 115 -


   * int ungetch(ch)
      ch   .

   * int getstr(str)
     int wgetstr(win, str)
     int mvgetstr(y, x, str)
     int mvwgetstr(win, y, x, str)
     int wgetnstr(win, str, n)
          getch(),   
  .    str,   
       
getstr(...).   ,    (
noecho(),   )    
 .

   * chtype inch()
     chtype winch(win)
     chtype mvinch(y, x)
     chtype mvwinch(win, y, x)
            . 
  chtype,   .  
       A_* (.  8.4).

   * int instr(str)
     int innstr(str, n)
     int winstr(win, str)
     int winnstr(win, str, n)
     int mvinstr(y, x, str)
     int mvinnstr(y, x, str, n)
     int mvwinstr(win, y, x, str)
     int mvwinnstr(win, y, x, str, n)
           . ( 
.)





                               - 116 -

   * int inchstr(chstr)
     int inchnstr(chstr, n)
     int winchstr(win, chstr)
     int winchnstr(win, chstr, n)
     int mvinchstr(y, x, chstr)
     int mvinchnstr(y, x, chstr, n)
     int mvwinchstr(win, y, x, chstr)
     int mvwinchnstr(win, y, x, chstr, n)
        chtype      
   . (  ; lib_inchstr 
   ncurses.)

     8.7.1.  

   * int scanw(fmt, ...)
     int wscanw(win, fmt, ...)
     int mvscanw(y, x, fmt, ...)
     int mvwscanw(win, y, x, fmt, ...)
     int vwscanw(win, fmt, va_list)
       scanf(...)  libc (.  8.1.2).
     wgetstr(...).

     8.8. 

      

   * int idlok(win, bf)
     void idcok(win, bf)
         /  
 (idlok(...)  , idcok(...) -  ).
(idcok(...)   .)

   * void immedok(win, bf)
       TRUE,      
  .    
,     - FALSE. ( 
.)


                               - 117 -

   |-------|-------|-------|         |-------|-------|-------|-------|
   |  ???  | KEY_  | KEY_  |         |  NUM  |   /   |   *   |   -   |
   |       | HOME  | PPAGE |         |       |       |       |       |
   |-------|-------|-------|         |-------|-------|-------|-------|
   | CTRL  | KEY_  | KEY_  |         | KEY_  | KEY_  | KEY_  |       |
   |  +D   | END   | NPAGE |         | HOME  | UP    | PPAGE |       |
   |-------|-------|-------|         |-------|-------|-------|   +   |
                                     | KEY_  |  ???  | KEY_  |       |
                                     | LEFT  |       | RIGHT |       |
           |-------|                 |-------|-------|-------|-------|
           | KEY_  |                 | KEY_  | KEY_  | KEY_  |       |
           | UP    |                 | END   | DOWN  | NPAGE | CTRL  |
   |-------|-------|-------|         |-------|-------|-------|  +M   |
   | KEY_  | KEY_  | KEY_  |         |      ???      | KEY_  |       |
   | LEFT  | DOWN  | RIGHT |         |               | DC    |       |
   |-------|-------|-------|         |-------|-------|-------|-------|

   * int clearok(win, bf)
      bf  TRUE,    wrefresh(win) 
     (Ctrl+L   vi).

   * int leaveok(win, bf)
       ncurses   ,     
 . ,   ,  
leaveok(...) TRUE   ,   .
 , ncurses     .

   * int nl()
     nonl()
         .  nl() 
   ; nonl()  .  
 ncurses    .







                               - 118 -

     8.8.1.  

   * int keypad(win, bf)
     TRUE  keypad      .
     keypad ncurses   ,
  KEY_*  ncurses.h.     
,         , 
 .

   * int meta(win, bf)
      TRUE,   ,  getch(), 8-
(   ).

   * int cbreak()
     int nocbreak()
     int crmode()
     int nocrmode()
     cbreak()  nocbreak()     
CBREAK.  CBREAK ,    
,   -      .
(: crmode()  nocrmode()   
,    .)

   * int raw()
     int noraw()
         RAW. RAW -   ,  
CBREAK,     .

   * int echo()
     int noecho()
      echo()      noecho(),
  .

   * int halfdelay(t)
      ,  cbreak()    t .




                               - 119 -

   * int nodelay(win, bf)
         . getch() 
ERR,    .  bf  FALSE,  getch()  
 .

   * int timeout(t)
     int wtimeout(win, t)
          halfdelay(t) 
nodelay(win, bf).  getch()    t. 
 t    t ;  t, 
,   ;   t 
,     .

   * int notimeout(win, bf)
      bf  TRUE, getch()   
    ,  
ESCAPE  ..

   * int typeahead(fd)
      fd,  -1,     
,    ncurses    
   fd  stdin.

   * int intrflush(win, bf)
        bf    (
quit, break)    tty.

   * void noqiflush()
     void qiflush()
     (  .)

     8.8.2.  

   * int baudrate()
         bps (  ).

   * char erasechar()
        erase.

                               - 120 -


   * char killchar()
        kill.

   * int has_ic()
     int has_il()
     has_ic()  TRUE,    /
, has_il()  TRUE,   
/ .     ERR. ( 
.)

   * char *longname()
           .

   * chtype termattrs()
     (  .)

   * char *termname
       TERM   . ( 
.)

     8.8.3.  

            .

      ,  Linux-    keypad. 
       
  .

keypad(stdscr,TRUE);

       2   :
     1)    ,  
  (, -  "press 'q' for
quit"   q);
     2) ,       
  (,      ).


                               - 121 -

             ,  
while  :

char c;

noecho();
timeout(-1);
nonl();
cbreak();
keypad(stdscr,TRUE);
while(c=getch()){
   switch(c){
      case 'q': your_quit_function();
      default: break;
   }
}

          .   q, 
 your_quit_function(),  -   .

      switch      . 
KEY_*     . ,

KEY_UP     KEY_RIGHT   KEY_A1   KEY_B2   KEY_C1
KEY_DOWN   KEY_LEFT    KEY_A3            KEY_C3

        .

            :

int loop=TRUE;
char c;
enum{UP,DOWN,RIGHT,LEFT};

noecho();
timeout(-1);
nonl();
cbreak();

                               - 122 -

keypad(stdscr,TRUE);
while(loop==TRUE){
   c=getch();
   switch(c){
      case KEY_UP:
      case 'u':
      case 'U': scroll_s(UP);
                break;
      case KEY_DOWN:
      case 'd':
      case 'D': scroll_s(DOWN);
                break;
      case KEY_LEFT:
      case 'l':
      case 'L': scroll_s(LEFT);
                break;
      case KEY_RIGHT:
      case 'r':
      case 'R': scroll_s(RIGHT);
                break;
      case 'q':
      case 'Q': loop=FALSE;
      default: break;
   }
}

       ,    echo(),  ,
 ,    .  
  move(...)  wmove(...).

            (  )
    :

WINDOW *maskwin;
WINDOW *mainwin;
char *ptr=(char *)malloc(255);
...
   mainwin=newwin(3,37,9,21);

                               - 123 -

   maskwin=newwin(1,21,10,35);
   ...
   werase(mainwin);
   werase(maskwin);
   ...
   box(mainwin,0,0)
   mvwaddstr(mainwin,1,2,"Inputstring:");
   ...
   wnoutrefresh(mainwin);
   wnoutrefresh(maskwin);
   doupdate();
   ...
   mvwgetstr(maskwin,0,0,ptr);
   ...
   delwin(maskwin);
   delwin(mainwin);
   endwin();
   free(ptr);

       . input.c   .

     8.9.    

* int erase()
  int werase(win)
     werase(...)  erase()      
win  stdscr. ,        
 werase(),    .   
   COLOR_PAIRS,    , 
   ,       
(     WINDOW):

void NewClear(WINDOW *win)
{
int y,x;

   for ( y = 0 ; y <= win -> _maxy ; y++ )
      for ( x = 0 ; x <= win -> _maxx ; x++ )

                               - 124 -

         (chtype *) win-> _line[y][x] = ' '|win-> _attrs;
   win -> _curx = win -> _cury = 0;   touchwin(win);
}

        ,  ncurses   
  ,    .  
lib_clrtoeol.c BLANK  

#define BLANK ' '|A_NORMAL,

    ,    .

   * int clear()
     int wclear(win)
      ,  erase(),     clearok() (
    ).

   * int clrtobot()
     int wclrtobot(win)
         (    
)    .

   * int clrtoeol()
     int wclrtoeol(win)
              
.

     8.10.  

        ,  ncurses    .
 ,        
   ,     . 
   ,    
  ,     
,     .    
    ,    
 .


                               - 125 -

   * int refresh()
     int wrefresh(win)
     refresh()  stdscr  ,  wrefresh(win) 
   stdscr    curscr  stdscr.

   * int wnoutrefresh(win)
     int dourdate()
     wnoutrefresh(win)   win   stdscr. 
,      ,   
stdscr      ,    .
doupdate()    .   
 ,  wnoutrefresh(win)   ,  
    doupdate(),   
.

     ,       . 
  ,    . 
cgangewin(win)  wrefresh(win).

main()                           changewin(WINDOW *win)
{                                {
WINDOW *win1,*win2;                 ... /*    */
   ...                              ... /*  */
   changewin(win1);                 wrefresh(win);
   changewin(win2);              return;
   ...                           }
}

      ncurses   ,    
 .  doupdate()   changewin(win)  
 ,    .

main()                           changewin(WINDOW *win)
{                                {
WINDOW *win1,*win2;                 ... /*    */
   ...                              ... /*  */
   changewin(win1);                 wnoutrefresh(win);
   changewin(win2);               return;

                               - 126 -

   doupdate();                   }
   ...
}

   * int redrawwin(win)
     int wredrawln(win, bline, nlines)
       ,    - 
       (  
  -  ).

   * int touchwin(win)
     int touchline(win, start, count)
     int wtouchln(win, y, n, changed)
     int untouchwin(win)
      ncurses-,       
   start  start+count. ,    
 ,    (   type.c),
         .

     wtouchln(...)  n ,   y.  change
 TRUE,   ,    - 
(   ).

     untouchwin(win)   win    
  refresh().

   * int is_linetouched(win, line)
     int is_wintouched(win)
           ,    line
  win      refresh().









                               - 127 -

      8.4: Ncurses - 

        |  
   ----------------|------------------------------------------------
   A_ATTRIBUTES    |    (chtype)
   A_NORMAL        | ,   
   A_STANDOUT      |   
   A_UNDERLINE     | 
   A_REVERSE       |  
   A_BLINK         | 
   A_DIM           |    
   A_BOLD          |     
   A_ALTCHARSET    |    
   A_INVIS         |  
   A_PROTECT       | ???
   A_CHARTEXT      |     (chtype)
   A_COLOR         |   
   COLOR_PAIR(n)   |    n
   PAIR_NUMBER(a)  |   ,    a

     8.11.   

      -    ,  
    .     ,
  ,    ..  ncurses  
       
  .     
.
      | 
   --------------|-----------
   COLOR_BLACK   | 
   COLOR_RED     | 
   COLOR_GREEN   | 
   COLOR_YELLOW  | 
   COLOR_BLUE    | 
   COLOR_MAGENTA | 
   COLOR_CYAN    | 
   COLOR_WHITE   | 

                               - 128 -


     Ncurses  8 ,     
   .   
   start_color(),  
    has_colors(). start_color() 
 COLORS,   , 
,  COLOR_PAIR,    ,  
 .

         '|' (OR),   
     
A_BOLD|A_BLINK

           attr,  ,
   ,      
    .     
     ..

        ,      ncurses
 BSD curses,   BSD curses    . (
        SYS V). , 
    ,   
 #ifdef.

   * int attroff(attr)
     int wattroff(win, attr)
     int attron(attr)
     int wattron(win, attr)
          attr,    
   (stdscr  win).

   * int attrset(attr)
     int wattrset(win, attr)
        attr  stdscr  win.





                               - 129 -

   * int standout()
     int standend()
     int wstandout(win)
     int wstandend(win)
            (stdscr 
win).

   * chtype getattrs(win)
          win.

   * bool has_colors()
      TRUE,    .  , 
 ,   has_colors()-,   
  start_color()-.

   * bool can_change_color()
     TRUE,     .

   * int start_color()
      .      
 !

   * int init_pair(pair, fg, bg)
           ,    
    init_pair(...). fg  bg -  
   ,   pair. pair  
 1  COLORPAIRS -1. (0 -  ,     
.)   pair    . 
,       :
init_pair(1,COLOR_RED,COLOR_BLUE);

       wattr(...)      
win:

wattr(win,COLOR_PAIR(1));




                               - 130 -

           , :

wattr(win,A_BOLD|COLOR_PAIR(1));
wattr(win1,A_STANDOUT|COLOR_PAIR(1));

            BOLD,  -
  STANDOUT,       
.

   * int pair_content(pair, f, b)
            pair.

   * int init_color(color, r, g, b)
        r, g  b  color. r, g  b
    1  COLORS -1.

   * int color_content(color, r, g, b)
       r, g  b  color.

         ?  , 
  Linux-,  ,   -  (xterm, vs100 
..).     :

void CheckColor(WINDOW *win1, WINDOW *win2)
{
   start_color();
   if (has_colors()){
      /* ,    ,    
       *     
       */
      init_pair(1,COLOR_BLUE,COLOR_WHITE);
      init_pair(2,COLOR_WHITE,COLOR_RED);

      /*         */
      wattrset(win1,COLOR_PAIR(2));
      wattrset(win2,COLOR_PAIR(1));
   }
else{

                               - 131 -

      /* ,   (  vt100  xterm). , 
       *    - .
       */
      wattrset(win1,A_REVERSE);
      wattrset(win2,A_BOLD);
   }
return;
}
      ,  CheckColor   
 start_color().  has_colors()  TRUE,  
  .    ini_tpair(...) 
     ,  wattrset(...) 
     . ,  
  - ,    
wattrset(...).

         xterm,  ,  ,
-   ansi_xterm    terminfo 
Midnight Commander-.    ansi_xterm  Midnight
Commander- (mc-x.x.tar.gz).   ansi_xterm 
 tic  xterm.ti  vt100.ti   mc-x.x.tar.gz.
 ansi_xterm   .

     8.12.    

   * int move(y, x)
     int wmove(win, y, x)
       stdscr  win.   /
  ,   
  .

   * int curs_set(bf)
      / ,   
 .

   * void getyx(win, y, x)
       . :  .


                               - 132 -

   * void getparyx(win, y, x)
      win - , getparyx(...)   
  .    y  x 
 -1. (  .)

   * void getbegyx(win, y, x)
     void getmaxyx(win, y, x)
     int getmaxx(win)
     int getmaxy(win)
           win  y  x.

   * int getsyx(int y, int x)
     int setsyx(int y, int x)
          y  x   
.  y  x,  -1, getsyx(...)  leaveok.

     8.13. 

   * int scrollok(win, bf)
      TRUE,    win      ,
         .
FALSE,      .

       scrollok(...)    
    . (:  
   ,     ,  
  ,     scrollok(...).)

   * int scroll(win)
         (    )  
 .

   * int scrl(n)
     int wscrl(win, n)
         stdscr  win   , 
   n.  n ,  
  n  ,  n  -  n  .


                               - 133 -

   * int setscrreg(t, b)
     int wsetscrreg(win, t, b)
        .

       ,     . 
 type.c   .

          ,  18   66 .
S[] -     . Max_s   
  S[]. Clear_line      
  ,     ( A_NORMAL,  
 clrtoeol). Beg -     s[],  
   . Scroll -   ,  
 ,  NEXT  PREVious (  )
 .

enum{PREV,NEXT};

void scroll_s(WINDOW *win, int scroll)
{
   /* ,        - ,
    *  
    */
   if((scroll==NEXT)&&(beg<=(max_s-18))){

   /*    */
      beg++;

   /*     */
      scrollok(win, TRUE);

   /*  */
      wscrl(win, +1);

   /*     */
      scrollok(win, FALSE);



                               - 134 -

   /*       */
      mvwaddnstr(win,17,0,s[beg+17],66);
   /*        
    * .     .
    */
       clear_line(66,win);
   }
   else if((scroll==PREV)&&(beg>0)){
      beg--;
      scrollok(win, TRUE);
      wscrl(win, -1);
      scrollok(win, FALSE);
      mvwaddnstr(win,0,0,s[beg],66);
      clear_line(66,win);
   }
   wrefresh(win);
return;
}

     8.14. 

   * WINDOW *newpad(nlines, ncols)

   * WINDOW *subpad(orig, nlines, ncols, begy, begx)

   * int prefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow, smaxcol)

   * int pnoutrefresh(pad, pminrow, pmincol, sminrow, smincol, smaxrow,
     smaxcol)

   * int pechochar(pad, ch)

              8.15.   (Soft-labels)

   * int slk_init(int fmt)

   * int slk_set(int labnum, char *label, int fmt)


                               - 135 -

   * int slk_refresh()

   * int slk_noutrefresh()
   * char *slk_label(int labnum)

   * int slk_clear()

   * int slk_restore()

   * int slk_touch()

   * int slk_attron(chtype attr)
     int slk_attrset(chtype attr)
     int slk_attroff(chtype attr)

         attron(attr), attrset(attr) 
attroff(attr).   .

     8.16. 

   * int beep()

   * int flash()

   * char *unctrl(chtype c)

   * char *keyname(int c)

   * int filter()
     (  .)

   * void use_env(bf)

   * int putwin(WINDOW *win, FILE *filep)
     (  .)

   * WINDOW *getwin(FILE *filep)
     (  .)

                               - 136 -


   * int delay_output(int ms)

   * int flushinp

     8.17.  

   * int def_prog_mode()

   * int def_shell_mode()

   * int reset_prog_mode()

   * int reset_shell_mode()

   * int resetty()

   * int savetty()

   * int ripoffline(int line, int (*init)(WINDOW *, int))

   * int napms(int ms)

     8.18.  

   * int scr_dump(char *filename)
     (  .)

   * int scr_restore(char *filename)
     (  .)

   * int scr_init(char *filename)
     (  .)

   * int scr_set(char *filename)
     (  .)



                               - 137 -

     8.19.  termcap

   * int tgetent(char *bp, char *name)

   * int tgetflag(char id[2])

   * int tgetnum(char id[2])
   * char tgetstr(char id[2], char **area)

   * char tgoto(char *cap, int col, int row)

   * int tputs(char *str, int affcnt, int (*putc)())

     8.20.  terminfo

   * int setupterm(char *term, int fildes, int *errret)

   * int setterm(char *term)

   * int set_curterm(TERMINAL *nterm)

   * int del_curterm(TERMINAL *oterm)

   * int restartterm(char *term, int fildes, int *errret)
     (  .)

   * char *tparm(char *str, p1, p2, p3, p4, p5, p6, p7, p8, p9)
     p1 - p9 long int.

   * int truts(char *str, int affcnt, int (*putc)(char))

   * int putp(char *str)

   * int vidputs(chtype attr, int (*putc)(char))

   * int vidsttr(chtype attr)

   * int mvcur(int oldrow, int oldcol, int newrow, int newcol)

                               - 138 -


   * int tigetflag(char *capname)

   * int tigetnum(char *capname)

   * int tigetstr(char *capname)

     8.21.  

   * void _init_trace()

   * void _tracef(char *, ...)

   * char *_traceattr(mode)

   * void traceon()

   * void traceoff()

     8.22.  (capabilities) terminfo

     8.22.1.  

                         . 
                               
   auto_left_margin           bw       bw    Cub1    0 
                                              
   auto_right_margin          am       am     
                                              
   back_color_erase           bce      ut        
   can_change                 ccc      cc      
                                              
   ceol_standout_glitch       xhp      xs      
                                              (hp)
   col_addr_glith             xhpa     YA      
                                               hpa/mhpa
   cpi_changes_res            cpix     YF      
                                              

                               - 139 -

   cr_cancels_micro_mode      crxm     YB     cr  
                                             micro
   eat_newline_glitch         xenl     xn       
                                             80  (Concept)
   erase_overstrike           eo       eo      
   generic_type               gn       gn       ( 
                                              
                                             )
   hard_copy                  hc       hc      
   hard_cursor                chts     HC     
   has_meta_key               km       km      ($shift, sets
                                             parity bit$)
   has_print_wheel            daisy    YC     
                                             ,  
                                               
   has_status_line            hs       hs      "
                                             "
   hue_lightness_saturation   hls      hl      
                                               HLS (Tektronix)
   insert_null_glitch         in       in       
   lpi_changes_res            lpix     YG       
                                             
   memory_above               da       da      
                                              
   memory_below               db       db      
                                              
   move_insert_mode           mir      mi      
                                              
   move_standout_mode         msgr     ms      
                                              
   needs_xon_xoff             nxon     nx       ,
                                              xon/xoff
   no_esc_ctl_c               xsb      xb    $Beehive$ (f1=escape, f2=Ctrl-C)
   non_rev_rmcup              nrrmc    NR    smcup   rmcup
   no_pad_char                npc      NP       
   non_dest_scroll_region     ndscr    ND      
   over_strike                os       os      
   prtr_silent                mc5i     5i         

                               - 140 -

   row_addr_glitch            xvpa     YD      
                                               vhp\mvpa
   semi_auto_right_margin     sam      YE       
                                              cr
   status_line_esc_ok         eslok    es    Escape   
                                               
   dest_tabs_magic_smso       xt       xt     , magic so
                                             char (Teleray 1061)
   tilde_glitch               hz       hz      
   transparent_underline      ul       ul     
   xon_xoff                   xon      xo      
                                             xon/xoff

     8.22.2. 

                         . 
                                
   bit_image_entwining        bitwin   Yo       SYSV
   buffer_capacity            bufsz    Ya     
   columns                    cols     co       
   dot_vert_spacing           spinv    Yb     ,  pin- 
                                             
   dot_horz_spacing           spinh    Yc     ,    
   init_tabs                  it       it      
                                             # 
   label_height               lh       lh       
   label_width                lw       lw       
   lines                      lines    li        
                                             
   lines_of_memory            lm       lm       , 0 
                                             
   magic_cookie_glitch        xmc      sg        smso
                                              rmso
   max_colors                 colors   Co      
                                              
   max_micro_address          maddr    Yd      
                                             micro_..._adress
   max_micro_jump             mjump    Ye      

                               - 141 -

                                             parm_..._micro
   max_pairs                  pairs    pa      
                                               
   micro_col_size             mcs      Yf        
                                             micro
   micro_line_size            mls      Yg         micro
   no_color_video             ncv      NC    ,  
                                               
   number_of_pins             npins    Yh     pin-   
   num_labels                 nlab     Nl       
   output_res_char            orc      Yi     , 
                                               
   output_res_line            orl      Yj     , 
                                               
   output_res_horz_inch       orhi     Yk     , 
                                               
   output_res_vert_inch       orvi     Yl     , 
                                               
   padding_baud_rate          pb       pb     ,  
                                             cr/nl 
   virtual_terminal           vt       vt      
                                             (UNIX)
   width_status_line          wsl      ms        

   (      term SYSV,  
     man page.     
   .)

   bit_image_type             bitype   Yp       
   buttons                    btns     BT      
   max_attributes             ma       ma      ,
                                                
                                              
   maximum_windows            wnum     MW      
                                             
   print_rate                 cps      Ym     ,   
                                             
   wide_char_size             widcs    Yn        

                               - 142 -

                                              
     8.22.3. 

                         . 
                               
   acs_chars                  acsc     ac    $Graphics charset pairs$ -
                                             def=vt100
   alt_scancode_esc           scesa    S8     esc  
                                             $scancode$ (  vt100)
   back_tab                   cbt      bt      (P)
   bell                       bel      bl      () (P)
   bit_image_repeat           birep    Xy      
                                              #1 #2  (
                                             tparm)
   bit_image_newline          binel    Zz       
                                               (
                                             tparm)
   bit_image_carriage_return  bicr     Yv       
                                               (
                                             tparm)
   carriage_return            cr       cr     
   change_char_pitch          cpi      ZA     #   
   change_line_pitch          lpi      ZB     #   
   change_res_horz            chr      ZC     
                                             
   change_res_vert            cvr      ZD     
                                             
   change_scroll_region       csr      cs      #1   #2
                                             (vt100) (PG)
   char_padding               rmp      rP     ip,    
                                             
   char_set_names             csnm     Zy      
                                             
   clear_all_tabs             tbc      ct       
                                             (P)
   clear_margins              mgc      MC       (,
                                               )
   clear_screen               clear    cl        home

                               - 143 -

                                             (P*)
   clr_bol                    el1      cb       
   clr_eol                    el       ce        (P)
   clr_eos                    ed       cd        (P*)
   code_set_init              csin     ci     
                                                
   color_names                colornm  Yw        #1
   column_address             hpa      ch       (PG)
   command_character          cmdch    CC    cmd  
                                               
   cursor_address             cup      cm        #1
                                              #2 (PG)
   cursor_down                cud1     do       
   cursor_home                home     ho     -   ( 
                                               )
   cursor_invisible           civis    vi      
   cursor_left                cub1     le       
                                              
   cursor_mem_address         mrcup    CM     
                                              
   cursor_normal              cnorm    ve      
                                              (undo vs/vi)
   cursor_right               cuf1     nd     
                                             ( )
   cursor_to_ll               ll       ll     ,  
                                             (   
                                             )
   cursor_up                  cuu1     up       
                                             ( )
   cursor_visible             cvvis    vs      
   define_bit_image_region    defbi    Yx     
                                               
                                             ( tparm)
   define_char                defc     ZE      
                                              
   delete_character           dch1     dc      (P*)   delete_line                dl1      dl      (P*)
   device_type                devt     dv     
                                             / 

                               - 144 -

   dis_status_line            dsl      ds      
   display_pc_char            dispc    S1      
   down_half_line             hd       hd    -  ( 1/2
                                              )
   ena_acs                    enacs    eA     
                                              
   end_bit_image_region       endbi    Yy       
                                             ( tparm)
   enter_alt_charset_mode     smacs    as      
                                              (P)
   enter_am_mode              smam     SA      
   enter_blink_mode           blink    mb     
   enter_bold_mode            bold     md      
   enter_ca_mode              smcup    ti      ,
                                               
   enter_delete_mode          smdc     dm      (enter)
   enter_dim_mode             dim      mh      
   enter_doublewide_mode      swidm    ZF       
   enter_draft_quality        sdrfq    ZG      
   enter_insert_mode          smir     im      (enter)
   enter_italics_mode         sitm     ZH      
   enter_leftward_mode        slm      ZI      
                                             
   enter_micro_mode           smicm    ZJ     
                                             
   enter_near_letter_quality  snlq     ZK      NLQ
   enter_normal_quality       snrmq    ZL      
                                             
   enter_pc_charset_mode      smpch    S2        
   enter_protected_mode       prot     mp      
   enter_reverse_mode         rev      mr      
   enter_scancode_mode        smsc     S4      scancode 
   enter_secure_mode          invis    mk      
                                             ( )
   enter_shadow_mode          sshm     ZM       
   enter_standout_mode        smso     so      
   enter_subscript_mode       ssubm    ZN      
   enter_superscript_mode     ssupm    ZO       

                               - 145 -

   enter_underline_mode       smul     us      
   enter_upward_mode          sum      ZP       
   enter_xon_mode             smxon    SX      
                                             xon/xoff
   erase_chars                ech      ec     #1  (PG)
   exit_alt_charset_mode      rmacs    ae      
                                              (P)
   exit_am_mode               rmam     RA      
   exit_attribute_mode        sgr0     me      
   exit_ca_mode               rmcup    te      ,
                                               
   exit_delete_mode           rmdc     ed      
   exit_doublewide_mode       rwidm    ZQ       
                                             
   exit_insert_mode           rmir     ei      
   exit_italics_mode          ritm     ZR      
   exit_leftward_mode         rlm      ZS      
                                              ( )
   exit_micro_mode            rmicm    ZT     
                                             
   exit_pc_charset_mode       rmpch    S3       
   exit_scancode_mode         rmsc     S5       
   exit_shadow_mode           rshm     ZU      
   exit_standout_mode         rmso     se      
   exit_subscript_mode        rsubm    ZV      
   exit_superscript_mode      rsupm    ZW      
   exit_underline_mode        rmul     ue         exit_upward_mode           rum      ZX       
   exit_xon_mode              rmxon    RX      
                                             xon/xoff
   flash_screen               flash    vb      (
                                              )
   form_feed                  ff       ff       
                                              (P*)
   form_status_line           fsl      fs       
   init_1string               is1      i1      
   init_2string               is2      i2      
   init_3string               is3      i3      
   init_file                  if       if      

                               - 146 -

   init_prog                  iprog    iP       
   initialize_color           initc    Ic      
   initialize_pair            initp    Ip      
   insert_character           ich1     ic      (P)
   insert_line                il1      al       
                                             (P*)
   insert_padding             ip       ip      
                                              (p*)
   key_a1                     ka1      K1      keypad-
   key_a3                     ka3      K3      keypad-
   key_b2                     ka2      K2     keypad-
   key_backspace              kbs      kb      backspace
   key_beg                    kbeg     1      
   key_btab                   kcbt     kB      
   key_c1                     kc1      K4      keypad-
   key_c3                     kc3      K5      keypad-
   key_cancel                 kcan     2      cancel
   key_catab                  ktbc     ka       
                                             
   key_clear                  kclr     kC       
                                                ()
   key_close                  kclo     3      close
   key_command                kcmd     4      
   key_copy                   kcpy     5      
   key_create                 kcrt     6      
   key_ctab                   kctab    kt      
                                             
   key_dc                     kdch1    kD       
   key_dl                     kdl1     kL       
   key_down                   kcud1    kd      
                                              
   key_eic                    krmir    kM      rmir  smir
                                               
   key_end                    kend     7      end
   key_enter                  kent     8      /
   key_eol                    kel      kE        
                                             
   key_eos                    ked      kS        

                               - 147 -

                                             
   key_exit                   kext     9      
   key_f0                     kf0      k0      F00
   key_f1                     kf1      k1      F01
   key_f2                     kf2      k2      F02
   key_f3                     kf3      k3      F03
   key_f4                     kf4      k4      F04
   key_f5                     kf5      k5      F05
   key_f6                     kf6      k6      F06
   key_f7                     kf7      k7      F07
   key_f8                     kf8      k8      F08
   key_f9                     kf9      k9      F09
   key_f10                    kf10     k;      F10
   key_f11                    kf11     F1      F11
   key_f12                    kf12     F2      F12
   key_f13                    kf13     F3      F13
   key_f14                    kf14     F4      F14
   key_f15                    kf15     F5      F15
   key_f16                    kf16     F6      F16
   key_f17                    kf17     F7      F17
   key_f18                    kf18     F8      F18
   key_f19                    kf19     F9      F19
   key_f20                    kf20     FA      F00
   key_f21                    kf21     FB      F01
   key_f22                    kf22     FC      F02
   key_f23                    kf23     FD      F03
   key_f24                    kf24     FE      F04
   key_f25                    kf25     FF      F05
   key_f26                    kf26     FG      F06
   key_f27                    kf27     FH      F07
   key_f28                    kf28     FI      F08
   key_f29                    kf29     FJ      F09
   key_f30                    kf30     FK      F10
   key_f31                    kf31     FL      F11
   key_f32                    kf32     FM      F12
   key_f33                    kf33     FN      F13
   key_f34                    kf34     FO      F14
   key_f35                    kf35     FP      F15

                               - 148 -

   key_f36                    kf36     FQ      F16
   key_f37                    kf37     FR      F17
   key_f38                    kf38     FS      F18
   key_f39                    kf39     FT      F19
   key_f40                    kf40     FU      F00
   key_f41                    kf41     FV      F01
   key_f42                    kf42     FW      F02
   key_f43                    kf43     FX      F03
   key_f44                    kf44     FY      F04
   key_f45                    kf45     FZ      F05
   key_f46                    kf46     Fa      F06
   key_f47                    kf47     Fb      F07
   key_f48                    kf48     Fc      F08
   key_f49                    kf49     Fd      F09
   key_f50                    kf50     Fe      F10
   key_f51                    kf51     Ff      F11
   key_f52                    kf52     Fg      F12
   key_f53                    kf53     Fh      F13
   key_f54                    kf54     Fi      F14
   key_f55                    kf55     Fj      F15
   key_f56                    kf56     Fk      F16
   key_f57                    kf57     Fl      F17
   key_f58                    kf58     Fm      F18
   key_f59                    kf59     Fn      F19
   key_f60                    kf60     Fo      F10
   key_f61                    kf61     Fp      F11
   key_f62                    kf62     Fq      F12
   key_f63                    kf63     Fr      F13
   key_find                   kfnd     0      
   key_help                   khlp     %1     
   key_home                   khome    kh      home
   key_ic                     kich1    kI       /
                                               
   key_il                     kil1     kA       
   key_left                   kcub1    kl      
                                              
   key_ll                     kll      kH      home-down
   key_mark                   kmrk     %2     

                               - 149 -

   key_message                kmsg     %3     
   key_move                   kmov     %4     
   key_next                   knxt     %5     
   key_npage                  knp      kN      
                                             
   key_open                   kopn     %6     
   key_options                kopt     %7     
   key_ppage                  kpp      kP      
                                             
   key_previous               kprv     %8     
   key_print                  kprt     %9     
   key_redo                   krdo     %0     redo
   key_reference              kref     &1     
   key_refresh                krfr     &2     
   key_replace                krpl     &3     
   key_restart                krst     &4     
   key_resume                 kres     &5      
   key_right                  kcuf1    kr       
   key_save                   ksav     &6     
   key_sbeg                   kBEG     &9       
                                             
   key_scancel                kCAN     &0     cancel  
                                             
   key_scommand               kCMD     *1       
                                             
   key_scopy                  kCPY     *2       
                                             
   key_screate                kCRT     *3       
                                                key_sdc                    kDC      *4      
                                               
   key_sdl                    kDL      *5      
                                               
   key_select                 kslt     *6     
   key_send                   kEND     *7       
                                             
   key_seol                   kEOL     *8        
                                             
   key_sexit                  kEXT     *9       

                               - 150 -

                                             
   key_sf                     kind     kF      
                                             /
   key_sfind                  kFND     *0       
                                             
   key_shelp                  kHLP     #1       
                                             
   key_shome                  kHOM     #2       
                                             
   key_sic                    kIC      #3       
                                              
   key_sleft                  kLFT     #4        
   key_smessage               kMSG     %a       
                                             
   key_smove                  kMOV     %b       
                                             
   key_snext                  kNXT     %c       
                                             
   key_soptions               kOPT     %d        
   key_sprevious              kPRV     %e       
                                             
   key_sprint                 kPRT     %f       
                                             
   key_sr                     kri      kR      
                                             /
   key_sredo                  kRDO     %g     redo   
   key_sreplace               kRPL     %h       
                                             
   key_sright                 kRIT     %i       
                                             
   key_sresume                kRES     %j       
                                              
   key_ssave                  kSAV     !1       
                                             
   key_ssuspend               kSPD     !2       
                                             
   key_stab                   khts     kT      
                                             

                               - 151 -

   key_sundo                  kUND     !3     undo   
   key_suspend                kspd     &7     
   key_undo                   kund     &8     undo
   key_up                     kcuu1    ku       
   keypad_local               rmkx     ke       $"keypad
                                             transmit"$
   keypad_xmit                smkx     ks      $"keypad
                                             transmit"$ 
   lab_f0                     lf0      l0       
                                             f0,   f0
   lab_f1                     lf1      l1       
                                             f1,   f1
   lab_f2                     lf2      l2       
                                             f2,   f2
   lab_f3                     lf3      l3       
                                             f3,   f3
   lab_f4                     lf4      l4       
                                             f4,   f4
   lab_f5                     lf5      l5       
                                             f5,   f5
   lab_f6                     lf6      l6       
                                             f6,   f6
   lab_f7                     lf7      l7       
                                             f7,   f7
   lab_f8                     lf8      l8       
                                             f8,   f8
   lab_f9                     lf9      l9       
                                             f9,   f9
   lab_f10                    lf10     la       
                                             f10,   f10
   label_on                   smln     LO      
   label_off                  rmln     LF      
   meta_off                   rmm      mo     
   meta_on                    smm      mm      (8- )
   micro_column_address       mhpa     ZY     column_address 
                                             
   micro_down                 mcud1    ZZ     cursor_down 
                                             

                               - 152 -

   micro_left                 mcub1    Za     cursor_left 
                                             
   micro_right                mcuf1    Zb     cursor_right 
                                             
   micro_row_address          mvpa     Zc     row_address 
                                             
   micro_up                   mcuu1    Zd     cursor_up 
                                                newline                    nel      nw      (,  lf
                                              cr)
   order_of_pins              porder   Ze      $buts$
                                              pin-  
   orig_colors                oc       oc       
   orig_pair                  op       op       
                                             ,   
                                             
   pad_char                   pad      pc    - ( 
                                             null)
   parm_dch                   dch      DC     #1  (PG*)
   parm_delete_line           dl       DL     #1  (PG*)
   parm_down_cursor           cud      DO        #1
                                              (PG*)
   parm_down_micro            mcud     Zf     cud  
   parm_ich                   ich      IC     #1  
                                             (PG*)
   parm_index                 indn     SF      #1  (PG)
   parm_insert_line           il       AL     #1   
                                             (PG*)
   parm_left_cursor           cub      LE        #1
                                              (PG)
   parm_left_micro            mcub     Zg     cul  
   parm_right_cursor          cuf      RI        #1
                                              (PG*)
   parm_right_micro           mcuf     Zh     cur  
   parm_rindex                rin      SR       #1 
                                             (PG*)
   parm_upcursor              cuu      UP        #1
                                              (PG*)
   parm_upmicro               mcuu     Zi     cuu  

                               - 153 -

   pkey_key                   pfkey    pk     
                                              #1    #2
   pkey_local                 pfloc    pl     
                                              #1  
                                              #2
   pkey_xmit                  pfx      px     
                                              #1  xmit  #2
   pkey_plab                  pfxl     xl      #1  xmit
                                             #2   #3
   plab_norm                  pln      pn      #1  
                                              #2
   print_screen               mc0      ps      
   prtr_non                   mc5p     pO       #1 
   prtr_off                   mc4      pf     
   prtr_on                    mc5      po     
   repeat_char                rep      rp      #1 #2 
                                             (PG*)
   req_for_input              rfi      RF      
   reset_1string              rs1      r1      
                                              
   reset_2string              rs2      r2      
                                              
   reset_3string              rs3      r3      
                                              
   reset_file                 rf       rf     ,  
                                             
   restore_cursor             rc       rc       
                                              sc
   row_address                vpa      cv      
                                             ( ) (PG)
   save_cursor                sc       sc       (P)
   scancode_escape            scesc    S7    Escape   scancode
   scroll_forward             ind      sf       (P)
   scroll_reverse             ri       sr       (P)
   select_char_set            scs      Zj      
   set0_des_seq               s0ds     s0    $Shift to codeset 0 (EUC set 0,
                                             ASCII)$
   set1_des_seq               s1ds     s1    $Shift to codeset 1$

                               - 154 -

   set2_des_seq               s2ds     s2    $Shift to codeset 2$
   set3_des_seq               s3ds     s3    $Shift to codeset 3$
   set_a_background           setab    AB       ,
                                              ANSI escape
   set_a_foreground           setaf    AF       ,
                                              ANSI escape
   set_attributes             sgr      sa      (PG9)
   set_background             setb     Sb       
                                             
   set_bottom_margin          smgb     Zk       
                                             
   set_bottom_margin_parm     smgbp    Zl       #1  #2 
                                               
                                              
   set_color_band             setcolor Yz       #1   set_color_pair             scp      sp       
   set_foreground             setf     Sf      
                                              
   set_left_margin            smgl     ML       
                                              
   set_left_margin_parm       smglp    Zm      () 
                                              #1 (#2)
   set_lr_margin              smglr    ML        
   set_page_lingth            slines   YZ        #1
                                              ( tparm)
   set_right_margin           smgr     MR       
                                              
   set_right_margin_parm      smgrp    Zn      #1  
                                             
   set_tab                    hts      st       
                                                
   set_tb_margin              smgtb    MT       
                                             
   set_top_margin             smgt     Zo       
                                              
   set_top_margin_parm        smgtp    Zp      #1  
                                             
   set_window                 wind     wi      -   #1-#2,
                                              #3-#4

                               - 155 -

   start_bit_image            sbim     Zq      bit image
   start_char_set_def         scsd     Zr      
                                             
   stop_bit_image             rbim     Zs      bit image
   stop_char_set_def          rcsd     Zt      
                                             
   subscript_characters       subcs    Zu      
   superscript_characters     supcs    Zv      
   tab                        ht       ta      8  
   these_cause_cr             docr     Zw       CR
   to_status_line             tsl      ts       , 
                                             
   underline_char             uc       uc       
                                              
   up_half_line               hu       hu      1/2 
                                             
   xoff_character             xoffc    XF     XOFF
   xon_character              xonc     XN     XON

   (      term SYSV,  
     man page.     
   .)

   label_format               fln      Lf     ??
   set_clock                  sclk     SC       
   display_clock              dclk     DK         
   remove_clock               rmclk    RC        ??
   create_window              cwin     CW       #1 
                                                #2, #3  #4 #5
   goto_window                wingo    WG        #1
   hangup                     hup      HU       
   dial_phone                 dial     DI        #1
   quick_dial                 qdial    QD        #1
                                                
   tone                       tone     TO       
   pulse                      pulse    PU       
   flash_hook                 hook     fh       
   fixed_pause                pause    PA       2-3 

                               - 156 -

   wait_tone                  wait     WA       
   user0                      u0       u0       #0
   user1                      u1       u1       #1
   user2                      u2       u2       #2
   user3                      u3       u3       #3
   user4                      u4       u4       #4
   user5                      u5       u5       #5
   user6                      u6       u6       #6
   user7                      u7       u7       #7   user8                      u8       u8       # 8
   user9                      u9       u9       # 9
   get_mouse                  getm     Gm     Curses  
                                                
   key_mouse                  kmous    Km     ??
   mouse_info                 minfo    Mi        
   pc_term_options            pctrm    S6       
   req_mouse_pos              reqmp    RQ        
                                              
   zero_motion                zerom    Zx                      8.23.   [n]curses

             (n)curses.
   bsd-curses (  2.1.0   SunOS 4.x), 
  - sysv-curses ( SunOS 5.4 / Solaris 2), ,
  -  (n)curses.     
   ,    .

x -    
n -    

                 BSD   SYSV  Nc. 

_init_trace()                       x   118
_traceattr(mode)                    x   118
_tracef(char *, ...)                x   118
addbytes(...)           x
addch(ch)               x     x     x   96
addchnstr(...)                x     x   96
addchstr(chstr)               x     x   96
addnstr(...)                  x     x   96

                               - 157 -

addnwstr(...)                 x
addstr(str)             x     x     x   96
addwch(...)                   x
addwchnstr(...)               x
addwchstr(...)                x
addwstr(...)                  x
adjcurspos()                  x
attroff(attr)                 x     x   110
attron(attr)                  x     x   110
attrset(attr)                 x     x   110
baudrate()              x     x     x   103
beep()                        x     x   115
bkgd(ch)                      x     x   100
bkgdset(ch)                   x     x   98
border(...)                   x     x   98
box(...)                x     x     x   98
can_change_color()            x     x   110
cbreak()                x     x     x   102
clear()                 x     x     x   107
clearok(...)            x     x     x   102
clrtobot()              x     x     x   107
clrtoeol()              x     x     x   107
color_content(...)            x     x   111
copywin(...)                  x     x   96
crmode()                x     x     x   102
curs_set(bf)                  x     x   112
curserr()                     x
def_prog_mode()               x     x   116
def_shell_mode()              x     x   116
del_curterm(...)              x     x   117
delay_output(ms)              x     x   115
delch()                 x     x     x   98
deleteln()              x     x     x   98
delscreen(...)                x     x,n 93
delwin(win)             x     x     x   95
derwin(...)                   x     x   95
doupdate()                    x     x   107
drainio(int)                  x

                               - 158 -

dupwin(win)                   x     x   95
echo()                  x     x     x   103
echochar(ch)                  x     x   96
echowchar(ch)                 x
endwin()                x     x     x   93
erase()                 x     x     x   106
erasechar()             x     x     x   104
filter()                      x     x   115
flash()                       x     x   115
flushinp()                    x     x   115
flushok(...)            x
garbagedlines(...)            x
garbagedwin(win)              x
getattrs(win)                 x     x   110
getbegyx(...)                 x     x   112
getbkgd(win)                  x
getbmap()                     x
getcap(str)             x
getch()                 x     x     x   100
getmaxx(win)                  x     x   112
getmaxy(win)                  x     x   112
getmaxyx(...)                 x     x   112
getmouse()                    x
getnwstr(...)                 x
getparyx(...)                 x     x   112
getstr(str)             x     x     x   100
getsyx(...)                   x     x   112
gettmode()              x     x
getwch(...)                   x
getwin(...)                   x
getwin(FILE *)                x     x,n 115
getwstr(...)                  x
getyx(...)              x     x     x   112
halfdelay(t)                  x     x   103
has_colors()                  x     x   110
has_ic()                      x     x,n 104
has_il()                      x     x,n 104
hline(...)                    x     x   98

                               - 159 -

idcok(...)                    x     x,n 101
idlok(...)              x     x     x   101
immedok(...)                  x     x   101
inch()                  x     x     x   100
inchnstr(...)                 x     x,n 101
inchstr(...)                  x     x,n 101
init_color(...)               x     x   111
init_pair(...)                x     x   110
initscr()               x     x     x   92
innstr(...)                   x     x,n 101
innwstr(...)                  x
insch(c)                x     x     x   97
insdelln(n)                   x     x   97
insertln()              x     x     x   97
insnstr(...)                  x     x   97
insstr(str)                   x     x   97
instr(str)                    x     x,n 101
inswch(...)                   x
inswstr(...)                  x
intrflush(...)                x     x   103
inwch(...)                    x
inwchnstr(...)                x
inwchstr(...)                 x
inwchstr(...)                 x
inwstr(...)                   x
is_linetouched(...)           x     x   108
is_wintouched(win)            x     x   108
isendwin()                    x     x   93
keyname(c)                    x     x   115
keypad(...)                   x     x   102
killchar()              x     x     x   104
leaveok(...)            x     x     x   102
longname()              x     x     x   104
map_button(long)              x
meta(...)                     x     x   102
mouse_off(long)               x
mouse_on(long)                x
mouse_set(long)               x

                               - 160 -

move(...)               x     x     x   112
movenextch()                  x
moveprevch()                  x
mvaddbytes(...)         x
mvaddch(...)            x     x     x   96
mvaddchnstr(...)              x     x   96
mvaddchstr(...)               x     x   96
mvaddnstr(...)                x     x   96
mvaddnwstr(...)               x
mvaddstr(...)           x     x     x   96
mvaddwch(...)                 x
mvaddwchnstr(...)             x
mvaddwchstr(...)              x
mvaddwstr(...)                x
mvcur(...)              x     x     x   117
mvdelch(...)            x     x     x   98
mvderwin(...)                 x     x,n 95
mvgetch(...)            x     x     x   100
mvgetnwstr(...)               x
mvgetstr(...)           x     x     x   100
mvgetwch(...)                 x
mvgetwstr(...)                x
mvhline(...)                  x
mvinch(...)             x     x     x   100
mvinchnstr(...)               x     x,n 101
mvinchstr(...)                x     x,n 101
mvinnstr(...)                 x     x,n 101
mvinnwstr(...)                x
mvinsch(...)            x     x     x   97
mvinsnstr(...)                x     x   97
mvinsnwstr(...)               x
mvinsstr(...)                 x     x   97
mvinstr(...)                  x     x,n 101
mvinswch(...)                 x
mvinswstr(...)                x
mvinwch(...)                  x
mvinwchnstr(...)              x
mvinwchstr(...)               x

                               - 161 -

mvinwstr(...)                 x
mvprintw(...)           x     x     x   97
mvscanw(...)            x     x     x   101
mvvline(...)                  x
mvwaddbytes(...)        x
mvwaddch(...)           x     x     x   96
mvwaddchnstr(...)             x     x   96
mvwaddchstr(...)              x     x   96
mvwaddnstr(...)               x     x   96
mvwaddnwstr(...)              x
mvwaddstr(...)          x     x     x   96
mvwaddwch(...)                x
mvwaddwchnstr(...)            x
mvwaddwchstr(...)             x
mvwaddwstr(...)               x
mvwdelch(...)           x     x     x   98
mvwgetch(...)           x     x     x   100
mvwgetnwstr(...)              x
mvwgetstr(...)          x     x     x   100
mvwgetwch(...)                x
mvwgetwstr(...)               x
mvwhline(...)                 x
mvwin(...)              x     x     x   95
mvwinch(...)            x     x     x   100
mvwinchnstr(...)              x     x,n 101
mvwinchstr(...)               x     x,n 101
mvwinnstr(...)                x     x,n 101
mvwinnwstr(...)               x
mvwinsch(...)           x     x     x   97
mvwinsnstr(...)               x     x   97
mvwinsstr(...)                x     x   97
mvwinstr(...)                 x     x,n 101
mvwinswch(...)                x
mvwinswstr(...)               x
mvwinwch(...)                 x
mvwinwchnstr(...)             x
mvwinwchstr(...)              x
mvwinwstr(...)                x

                               - 162 -

mvwprintw(...)          x     x     x   97
mvwscanw(...)           x     x     x   101
mvwvline(...)                 x
napms(ms)                     x     x   116
newkey(...)                   x
newpad(...)                   x     x   114
newscreen(...)                x
newterm(...)                  x     x   92
newwin(...)             x     x     x   93
nl()                    x     x     x   102
nocbreak()              x     x     x   102
nocrmode()              x     x     x   102
nodelay(...)                  x     x   103
noecho()                x     x     x   103
nonl()                  x     x     x   102
noqiflush()                   x     x,n 103
noraw()                 x     x     x   103
notimeout(...)                x     x   103
overlay(...)            x     x     x   95
overwrite(...)          x     x     x   95
pair_content(...)             x     x   111
pechochar(...)                x     x   114
pechowchar(...)               x
pnoutrefresh(...)             x     x   114
prefresh(...)                 x     x   114
printw(...)             x     x     x   97
putp(char *)                  x     x   117
putwin(...)                   x     x,n 115
qiflush()                     x     x,n 103
raw()                   x     x     x   103
redrawwin(win)                x     x   108
refresh()               x     x     x   107
request_mouse_pos()           x
reset_prog_mode()             x     x   116
reset_shell_mode()            x     x   116
resetty()               x     x     x   116
restartterm(...)              x     x,n 117
ripoffline(...)               x     x   116

                               - 163 -

savetty()               x     x     x   116
scanw(...)              x     x     x   101
scr_dump(char *)              x     x,n 116
scr_init(char *)              x     x,n 116
scr_restore(char *)           x     x,n 116
scr_set(char *)               x     x,n 116
scrl(n)                       x     x   113
scroll(win)             x     x     x   113
scrollok(...)           x     x     x   112
set_curterm(...)              x     x   117
set_term(...)                 x     x   93
setcurscreen(SCREEN *)        x
setscrreg(...)                x     x   113
setsyx(...)                   x     x   112
setterm(char *)         x     x     x   117
setupterm(...)                x     x   117
slk_attroff(attr)             x     x,n 115
slk_attron(attr)              x     x,n 115
slk_attrset(attr)             x     x,n 115
slk_clear()                   x     x   115
slk_init(fmt)                 x     x   114
slk_label(labnum)             x     x   115
slk_noutrefresh()             x     x   114
slk_refresh()                 x     x   114
slk_restore()                 x     x   115
slk_set(...)                  x     x   114
slk_touch()                   x     x   115
standend()              x     x     x   110
standout()              x     x     x   110
start_color()                 x     x   110
subpad(...)                   x     x   114
subwin(...)             x     x     x   95
syncok(...)                   x     x,n 95
--------------------------------------------------------------
termattrs()                   x     x,n 104
termname()                    x     x,n 104
tgetent(...)                  x     x   116
tgetflag(char [2])            x     x   116

                               - 164 -

tgetnum(char [2])             x     x   116
tgetstr(...)                  x     x   117
tgoto(...)                    x     x   117
tigetflag(...)                x     x   117
tigetnum(...)                 x     x   117
tigetstr(...)                 x     x   117
timeout(t)                    x     x   103
touchline(...)          x     x     x   108
touchwin(win)           x     x     x   108
tparm(...)                    x     x   117
tputs(...)                          x   117
traceoff()                    x     x   118
traceon()                     x     x   118
typeahead(fd)                 x     x   103
unctrl(chtype c)              x     x   115
ungetch(ch)                   x     x   100
ungetwch(c)                   x
untouchwin(win)               x     x   108
use_env(bf)                   x     x   115
vidattr(...)                  x     x   117
vidputs(...)                  x     x   117
vidupdate(...)                x
vline(...)                    x     x   98
vwprintw(...)                 x     x   97
vwscanw(...)                  x     x   101
waddbytes(...)          x
waddch(...)             x     x     x   96
waddchnstr(...)               x     x   96
waddchstr(...)                x     x   96
waddnstr(...)                 x     x   96
waddnwstr(...)                x
waddstr(...)            x     x     x   96
waddwch(...)                  x
waddwchnstr(...)              x
waddwchstr(...)               x
waddwstr(...)                 x
wadjcurspos(win)              x
wattroff(...)                 x     x   110

                               - 165 -

wattron(...)                  x     x   110
wattrset(...)                 x     x   110
wbkgd(...)                    x     x   100
wbkgdset(...)                 x     x   98
wborder(...)                  x     x   98
wclear(win)             x     x     x   107
wclrtobot(win)          x     x     x   107
wclrtoeol(win)          x     x     x   107
wcursyncup(win)               x     x,n 95
wdelch(win)             x     x     x   98
wdeleteln(win)          x     x     x   98
wechochar(...)                x     x   96
wechowchar(...)               x
werase(win)             x     x     x   106
wgetch(win)             x     x     x   100
wgetnstr(...)                 x     x   100
wgetnwstr(...)                x
wgetstr(...)            x     x     x   100
wgetwch(...)                  x
wgetwstr(...)                 x
whline()                      x
whline(...)                   x
whline(...)                   x     x   98
winch(win)              x     x     x   100
winchnstr(...)                x     x,n 101
winchstr(...)                 x     x,n 101
winnstr(...)                  x     x,n 101
winnwstr(...)                 x
winsch(...)             x     x     x   97
winsdelln(...)          x     x     x   97
winsertln(win)                x     x   97
winsnstr(...)                 x     x   97
winsnwstr(...)                x
winsstr(...)                  x     x   97
winstr(...)                   x     x,n 101
winswch(...)                  x
winswstr(...)                 x
winwch(...)                   x

                               - 166 -

winwchnstr(...)               x
winwchstr(...)                x
winwstr(...)                  x
wmouse_position(...)          x
wmove(...)              x     x     x   112
wmovenextch(win)              x
wmoveprevch(win)              x
wnoutrefresh(win)             x     x   107
wprintw(...)            x     x     x   97
wredrawln(...)                x     x   108
wrefresh(win)           x     x     x   107
wscanw(...)             x     x     x   101
wscrl(...)                    x     x   113
wsetscrreg(...)               x     x   113
wstandend(win)          x     x     x   110
wstandout(win)          x     x     x   110
wsyncdown(win)                x     x,n 95
wsyncup(win)                  x     x,n 95
wtimeout(...)                 x     x   103
wtouchln(...)                 x     x   108
wvline()                      x
wvline(...)                   x
wvline(...)                   x     x   98

   To be continued...

     9.   /

          2   1 
.      
 .

   * /dev/ttyS0 - /dev/ttySn
     RS232   0 - n,  n   
 .

   * /dev/cua0 - /dev/cuan
     RS232   0 - n,  n   

                               - 167 -

 .

   * /dev/lp0 - /dev/lpn
       0 - n,  n   
 .

   * /dev/js0 - /dev/jsn
      0 - n,  0<= n <=1.

       /dev/ttyS*  /dev/cua*    open().
/dev/cua*     , , 
,      
/dev/ttyS*. /dev/ttyS*     
.      
 ,  .  ioctl()   
 ,  POSIX   
   .     
 termios.     .

     1)  ioctl:
     TCSBRK, TCSBRKP, TCGETA (get attributes -  ),
TCSETA (set attributes -  );  
/  (terminal I/O control - TIOC): TIOCGSOFTCAR
($get soft carrier$), TIOCSSOFTCAR ($setsoftcarrier$), TIOCSCTTY (set
controlling tty -   tty), TIOCMGET (get
modemlines), TIOCMSET, TIOCGSERIAL, TIOCSSERIAL, TIOCSERCONFIG,
TIOCSERGWILD, TIOCSERGSTRUCT, TIOCMBIS, TIOCMBIC, ...

     2)  POSIX:
     tcgetattr(), tcsetattr(), tcsendbreak(), tcdrain(), tcflush(),
tcflow(), tcgetpgrp(), tcsetpgrp() cfsetispeed(), fgetispeed(),
cfgetospeed()

     3)  :
     outb, inb   , , 
     .



                               - 168 -

     9.1.  

          ,    
.       ,  
 . ,   (Andrew Haylett) 
 ,        selection, 
        .  
   - selection-1.8   COPYRIGHT.
, X11     API,  
     -X11 .  
selection     mouse.h  mouse.c.

            ms_init() 
get_ms_event(). ms_init()   10 .

     1) int acceleration
      .     ,  
delta ,       
.

     2) int baud
     bps -    ( 1200 bps)

     3) int delta
      ,    ,  
 (. 1).

     4) char *device
       (, /dev/mouse).

     5) int toggle
      DTR, RTS   DTR  RTS     
 ( - 0).

     6) int sample
        dpi ( 100).



                               - 169 -

     7) mouse_type mouse
       ,  P_MSC (Mouse Systems
Corp.).

     8) int slack
       -1,      ; 
slack >=0     ,    
  slack .

     9) int maxx
         x.    
  10 ,     x  10*80-1.

     10) int maxy
           12 , 
    y 12*25-1 .

     get_ms_event()      
ms_event.  get_ms_event()  -1,   . 
   0,  ms_event   
.

     9.2.  

      Hayes Commands   .  
 rs232   termios.   miniterm.c.

     9.3.  

       checklp.c.   termios  
 ,  ioctl, inb/outnb,  ,
 Epson, Postscript, PCL  ..

 ioctl: LPCHAR, LPTIME, LPABORT, LPSETIRQ, LPGETIRQ, LPWAIT
inb  outb     .




                               - 170 -

     9.4.  

       js.c      .
  ioctl: JS_SET_CAL, JS_GET_CAL,
JS_SET_TIMEOUT, JS_GET_TIMEOUT, JS_SET_TIMELIMIT, JS_GET_TIMELIMIT,
JS_GET_ALL, JS_SET_ALL.  

     10.     Linux

     10.1. 

      UNIX-  Linux  . Linux  
GNU     ,   ;
        make.
    ,    - 
  ,    
   , , ,
  .

     Linux      IEEE Std 1003.1-1988
(POSIX.1),     . Linux  
  SVID  BSD  UNIX,        
 .  , Linux   
    UNIX,   
 ,       
    .

     ,  timeout,    select,
    Linux-   .  
    ,  ,  
Linux-  .  SunOS  BSD , 
  timeout -  " ". 
,      ,  timeout
.

        -    ,  
   Linux,    Linux, POSIX.1,
SVID  BSD   :  , / 

                               - 171 -

,       
 .

     10.2.  

            
   UNIX.   
 2  :  (unreliable)  
(reliable).   -  ,    
     "-" 
    ,   
  . -    , 
       -   
 ,    -      
  (,  ).  
,       
  .

            
    .  
      
  errno       , 
   EINTR.

             
        
 .    
        
 .

     ,     
      .  
       ,  
     POSIX sigsuspend.





                               - 172 -

     10.2.1.   SVR4, BSD  POSIX.1

     SVR4-    signal, sigset,
sighold, sigrelse, sigignore  sigpause.  signal 
  UNIX V7,    
.     .
    .

     BSD   signal, sigvec, sigblock, sigsetmask 
sigpause.   ,     .
    .

      POSIX.1   sigaction, sigprocmask,
sigpending  sigsuspend.    signal: 
 .      ,
      .  sigaction
  BSD  SVR4,     
 .       SA_RESTART.

      ,      -  sigaction, 
     . 
signal        ,   ,
    BSD  SVR4.

     10.2.2.   Linux

      Linux     sa_flags 
sigaction.
     * SA_NOCLDSTOP:   SIGCHLD   
-.

     * SA_RESTART:    
     .

     * SA_NOMASK:    (  
    ).



                               - 173 -

     * SA_ONESHOT:     .
,  SVR4  SA_RESETHAND    .

     * SA_INTERRUPT:   Linux-,   . 
SunOS    ,   
  .

     * SA_STACK:     ;  
 .

     ,  POSIX.1   SA_NOCLDSTOP, 
   ,  SVR4,  
 Linux-.     , 
 sigaction, , ,   
sa_flags,    .

     10.2.3. signal  Linux-

      signal  Linux-   sigaction 
 SA_ONESHOT  SA_NOMASK,   
    SVR4.

         signal   BSD,   
 Linux-    BSD ,
  .      
 

-I/usr/include/bsd -lbsd

   .  , 
signal,   ,    
   ,    (
   ),  
 .





                               - 174 -

     10.2.4. ,  Linux-

     Linux    ,  SVR4,
BSD  POSIX,   :

     * SIGEMT  ;     
SVR4  BSD.

     * SIGINFO  ;    
    SVR4.

     * SIGSYS  ;    
   SVR4  BSD.    libbsd  
  SIGUNUSED.

     * SIGABRT  SIGIOT .

     * SIGIO, SIGPOLL  SIGURG .

     * SIGBUS   SIGUNUSED.    Linux 
 " ".

     10.3. /  

      ,   ,  /  3
 :  SVR4, BSD  POSIX.1.

     SVR4    termio    ioctl
(,  TCSETA, TCGETA  ..)    
 .    :

struct termio {
   unsigned short c_iflag;  /*   */
   unsigned short c_oflag;  /*   */
   unsigned short c_cflag;  /*   */
   unsigned short c_lflag;  /*    */
   char c_line              /*   */
   unsigned char c_cc[NCC]; /*   */

                               - 175 -

};

      BSD  ioctl  TIOCGETP, TIOCSETP  ..  
 sgtty.

      POSIX-   termios   
 POSIX.1,   tcsetattr  tcgetattr.  termios
  termio  SVR4,   
(, tcflag_t  unsigned short),     c_cc
 NCCS.

      Linux-    termios POSIX.1,  termio
SVR4.  , ,      
  /  ,     
 Linux-.    - ,    
   ,   termio  termios.
, , ,    .   
,      c_line  termio.
        N_TTY,  
     , 
  .

          BSD sgtty,  
 libbsd,   .   
ioctl,    /   
  termios POSIX-,  . 
  ,    TIOCGETP  ,
   libbsd.

     10.4.  

      ,  ps, top  free,   
        .
,       
   .

           
UNIX,      -,   

                               - 176 -

  ,    
       .

     10.4.1.  kvm

             
 /dev/kmem   kvm_open, kvm_nlist  kvm_read.
  /dev/kmem,    ,
        
       
  .    
    ,    
,       
,    ..

     10.4.2. ptrace    /proc

       ptrace   4.3BSD  SVID 
      .  
  , , trap-  (
  )    .  SVR4
ptrace    /proc,   
,        
 ,  ID . 
         
   ioctl     
     . ,  
        
      /proc.

     10.4.3.    Linux

      Linux-     
 ptrace,   ,  4.3BSD.   
    Linux    
/proc,     .  Linux- /proc 
     ,   
,  ,    

                               - 177 -

 .     read  write; 
  ,  scanf.   /proc
 Linux-        
 ,  ID .   
      ,   
   ,    
..          read.
      /proc,
  Plan 9,     . , 
ps,        
,    ,   
 .  :  kvm   UNIX-
   ,    
.

     ,    ,  
,  ,    . 
 ,    /proc  SVR4  , 
 Linux-,          . 
   ,   kvm  
 /proc SVR4,  ,     
 .

      ptrace Linux-  BSD ,     
:

     *  PTRACE_PEEKUSER  PTRACE_POKEUSER  BSD 
 PTRACE_PEEKUSR  PTRACE_POKEUSR  Linux-.

     *       
 PTRACE_POKEUSR  ,  
/usr/include/linux/ptrace.h.

     *  SunOS- PTRACE_{READ,WRITE}{TEXT,DATA} 
,     PTRACE_SETACBKPT, 
PTRACE_SETWRBKPT,  PTRACE_CLRBKPT,  PTRACE_DUMPCORE. 
        .


                               - 178 -

     Linux    kvm    
   ,     ,  
kmem_ps,      .
 ,  ,   ,  kvm,
 ,       
 ,      -.

     10.5.   

            
  Linux-,    
ifdef...endif  ,      .
    ,   
,     ,   SVR4
  System V,  BSD  BSD-   linux -  Linux-
:

   * __STRICT_ANSI__:   ANSI C

   * _POSIX_SOURCE:  POSIX.1

   * _POSIX_C_SOURCE:    1,   POSIX.1,
 2 -  POSIX.2

   * _BSD_SOURCE: ANSI, POSIX  BSD

   * _SVID_SOURCE: ANSI, POSIX  System V

   * _GNU_SOURCE: ANSI, POSIX, BSD, SVID  GNU . 
  ,      .

        _BSD_SOURSE,    
_FAVOR_BSD.    POSIX-  SVR4   , 
 BSD. ,   _FAVOR_BSD, setgmp  longgmp 
    ,  getpgrp  
 PID. ,       libbsd,
  BSD-.


                               - 179 -

     gcc Linux-    ,  
    :

   * __GNUC__ (major GNU C , e.g., 2)
   * __GNUC_MINOR__ (minor GNU C , e.g., 2)
   * unix
   * i386
   * linux
   * __unix__
   * __i386__
   * __linux__
   * __unix
   * __i386
   * __linux

     

#ifdef linux

  Linux- . ,  Linux 
   Sistem V,    , 
  Sistem V  BSD,    Sistem V-. , 
    BSD     libbsd.

     10.6.  

        ,   , ,
,    ,    
 ,   ( ,  
     ftp.uni-stuttgart.de 
pub/systems/linux/isdn). (   /Sven Goldt/.)








                               - 180 -

     11.   

   _exit                      -  exit,   
                                 (m+c)
   accept                     -     (m+c!)
   access                     -     
                                 (m+c)
   acct                       -    (mc)
   adjtimex                   - /  
                                 (-c)
   afs_syscall                -   
                                  andrew (-)
   alarm                      -  SIGALARM   
                                (m+c)
   bdflush                    -      (-c)
   bind                       -    
                                 (m!c)
   break                      -    (-)
   brk                        -     (mc)
   chdir                      -    (m+c)
   chmod                      -    (m+c)
   chown                      -    (m+c)
   chroot                     -    
                                (mc)
   clone                      - . fork (m-)
   close                      -     (m+c)
   connect                    -  2  (m!c)
   creat                      -   (m+c)
   creat_module               -     
                                 (-)
   delete_module              -    (-)
   dup                        -    (m+c)
   dup2                       -    (m+c)
   execl, execlp, execle, ... - . execve (m+!c)
   execve                     -   (m+c)
   exit                       -   (m+c)
   fchdir                     -      ()
   fchmod                     - . chmode (mc)

                               - 181 -

   fchown                     -    (mc)
   fclose                     -     (m+!c)
   fcntl                      -  /  (m+c)   flock                      -    (m!c)
   fork                       -    (m+c)
   fpathconf                  -       (m+!c)
   fread                      -      
                                (m+!c)
   fstat                      -    (m+c)
   fstatus                    -      
                                (mc)
   fsync                      -      (mc)
   ftime                      -   +   1.1.1970
                                (m!c)
   ftruncate                  -    (mc)
   fwrite                     -      
                                (m+!c)
   get_kernel_syms            -      
                                 (-)
   getdomainname              -     (m!c)
   getdtablesize              -    
                                 (m!c)
   getegid                    -   id  (m+c)
   geteuid                    -   id  (m+c)
   getgid                     -  id  (m+c)
   getgroups                  -    (m+c)
   gethostid                  -    
                                 (m!c)
   gethostname                -     (m!c)
   getitimer                  -     (mc)
   getpagesize                -      (m-!c)
   getpeername                -    
                                 (m!c)
   getpgid                    -  id   
                                (+c)
   getpgrp                    -  id   
                                 (m+c)
   getpid                     -  id   (m+c)
   getppid                    -  id   (m+c)

                               - 182 -

   getpriority                -   (, ,
                                ) (mc)
   getrlimit                  -    (mc)
   getrusage                  -   (m)
   getsockname                -    (m!c)
   getsockopt                 -     (m!c)
   gettimeofday               -     1.1.1970 (mc)
   getuid                     -   id 
                                (m+c)
   gtty                       -    ()
   idle                       -     
                                (mc)
   init_module                -     (-)
   ioctl                      -     (mc)
   ioperm                     -     / 
                                 (m-c)
   iopl                       -     /  
                                (m-c)
   ipc                        -   (-c)
   kill                       -    (m+c)
   killpg                     -     (mc!)
   klog                       - . syslog (-!)
   link                       -      
                                (m+c)
   listen                     -    (m!c)
   llseek                     - lseek   

   lock                       -    ()
   lseek                      -   ptr  
                                (m+c)
   lstat                      -    (mc)
   mkdir                      -   (m+c)
   mknod                      -   (mc)
   mmap                       -     (mc)
   modify_ldt                 -     
                                 (-)
   mount                      -    (mc)
   mprotect                   - ,     

                               - 183 -

                                 (-)
   mpx                        -    ()
   msgctl                     -   ipc (m!c)
   msgget                     -  id   ipc (m!c)
   msgrcv                     -   ipc (m!c)
   msgsnd                     -   ipc (m!c)
   munmap                     -      (mc)
   nice                       -    (mc)
   oldfstat                   -   
   oldlstat                   -   
   oldolduname                -   
   oldstat                    -   
   olduname                   -   
   open                       -   (m+c)
   pathconf                   -     (m+!c)
   pause                      -    (m+c)
   personality                -     
                                ibcs (-)
   phys                       -    (m)
   pipe                       -   (m+c)
   prof                       -    ()
   profil                     -  '  (m!c)
   ptrace                     -   (mc)
   quotactl                   -    ()
   read                       -     (m+c)
   readv                      -      (m!c)
   readdir                    -   (m+c)
   readlink                   -     (mc)
   reboot                     -     
                                  (-mc)
   recv                       -    
                                 (m!c)
   recvfrom                   -     (m!c)
   rename                     - /  (m+c)
   rmdir                      -    (m+c)
   sbrk                       - . brk (mc!)
   select                     -     
                                 (mc)

                               - 184 -

   semctl                     -   ipc (m!c)
   semget                     - ipc   
                                 (m!c)
   semop                      -  ipc   
                                 (m!c)
   send                       -     
                                (m!c)
   sendto                     -     (m!c)
   setdomainname              -     (mc)
   setfsgid                   -  id    ()
   setfsuid                   -  id   
                                 ()
   setgid                     -   id  (m+c)
   setgroups                  -    (mc)
   sethostid                  -   
                                  (mc)
   sethostname                -     (mc)
   setitimer                  -    (mc)
   setpgid                    -    
                                (m+c)
   setpgrp                    -     (mc!)
   setpriority                -   (, ,
                                ) (mc)
   setregid                   -    
                                  (mc)
   setreuid                   -    
                                  (mc)
   setrlimit                  -    (mc)
   setsid                     -   (+c)
   setsockopt                 -    (mc)
   settimeofday               -    ( 1.1.1970) (mc)
   setuid                     -   
                                 (m+c)
   setup                      -    
                                 (-)
   sgetmask                   - . siggetmask (m)
   shmat                      -     
                                 (m!c)

                               - 185 -

   shmctl                     -     (m!c)
   shmdt                      -     
                                 (m!c)
   shmget                     - /  
                                 (m!c)
   shutdown                   -   (m!c)
   sigaction                  - /  
                                (m+c)
   sigblock                   -   (m!c)
   siggetmask                 -  ,  
                                 (!c)
   signal                     -    (mc)
   sigpause                   -    , 
                                 signal (mc)
   sigpending                 -  ,  
                                 (m+c)
   sigprocmask                - / , 
                                  (+c)
   sigreturn                  -    ()
   sigsetmask                 -  ,  
                                 (c!)
   sigsuspend                 -   sigpause (m+c)
   sigvec                     - . sigaction (m!)
   socket                     -     (m!c)
   socketcall                 -    (-)
   socketpair                 -  2   (m!c)
   ssetmask                   - . sigsetmask (m)
   stat                       -    (m+c)
   statfs                     -     (mc)
   stime                      -    1.1.1970 (mc)
   stty                       -    ()
   swapoff                    -    /
                                (m-c)
   swapon                     -    / (m-c)
   symlink                    -      (m+c)
   sync                       -      (mc)
   syscall                    -      (-!c)
   sysconf                    -    

                               - 186 -

                                (m+!c)
   sysfs                      -    
                                  ()
   sysinfo                    -    Linux- (m-)
   syslog                     -     (m-c)
   system                     -   shell- (m!c)
   time                       -    1.1.1970 (m+c)
   times                      -  '  
                                (m+c)
   truncate                   -    (mc)
   ulimit                     - /   (c!)
   umask                      -     (m+c)
   umount                     -    (mc)
   uname                      -    (m+c)
   unlink                     -    (m+c)
   uselib                     -    (m-c)
   ustat                      -    (c)
   utime                      -  '  inode (m+c)
   utimes                     - . utime (m!c)
   vfork                      - . fork (m!c)
   vhangup                    -    tty (m-c)
   vm86                       -     8086 (m-c)
   wait                       -    (m+!c)
   wait3                      - bsd    (m!c)
   wait4                      - bsd    (mc)
   waitpid                    -    (m+c)
   write                      -     (m+c)
   writev                     -      (m!c)

   (m)  manual page.
   (+)  POSIX-.
   (-)   Linux-.
   (c)  libc.
   (!)    ,    .





                               - 187 -

     12. 

   ANSI     American National Standard for Information Systems
   API      Application Programming Interface
   ASCII    American Standard Code for Information Interchange
   AT 386   Advanced Technology Intel 80386 based PC
   FIPS     Federal Information Processing Standard
   FSF      Free Software Foundation
   IEEE     Institute of Electrical and Electronics Engineers, Inc.
   IPC      Inter Process Communication
   ISO      International Organization for Standards
   POSIX    Portable Operating System Interface for uniX
   POSIX.1  IEEE Std. 1003.1-1990 Standard for Information Technology -
            Portable Operating System Interface (POSIX) - Part 1:
            System Application Programming Interface (API)
























                               - 188 -

                                  

1.   LINUX                                        2
2.  LINUX                                                        3
3.  libc                                                   3
4.                                                    4
5. iotl                                                             5
6.   LINUX                                 6
6.1.                                                         6
6.2.   UNIX                                      6
6.2.1.                                                6
6.2.2.                                            8
2.  LINUX                                                       10
6.2.3.  -  !                                        15
6.2.4.  ()                       20
6.2.5.                              20
6.3.   (FIFOs - First In First Out)                21
6.3.1.                                               21
6.3.2.  FIFO                                                21
6.3.3.  FIFO                                                23
6.3.4.    FIFO                               25
6.3.5.  SIGPIPE                                          25
6.4 System V IPC                                                    26
6.4.1.                                                26
6.4.2.                                              29
6.4.3.                                                      49
6.4.4.                                             72
7.                                             82
7.1.                             82
7.2.                                   83
8.                                                 84
8.1.  /  libc                                    86
8.1.1.                                          86
8.1.2.                                           88
8.2.  termcap                                             89
8.2.1.                                                      89
8.2.2.                                        91
8.2.3.                                             92

                               - 189 -

8.2.4.  termcap                                             93
8.3.   ncurses                                            101
8.4.                                                  104
8.5.                                                           105
8.6.                                                          109
8.6.1.                                         110
8.6.2.                                        111
8.6.3.                                       112
8.6.4.                                                  112
8.6.5.  (background)                                  113
8.7.                                                           114
8.7.1.                                          116
8.8.                                                          116
8.8.1.                                                   118
8.8.2.                                            119
8.8.3.                                           120
8.9.                                              123
8.10.                                           124
8.11.                                            127
8.12.                                        131
8.13.                                                     132
8.14.                                                   134
8.15.   (Soft-labels)                                   134
8.16.                                                        135
8.17.                                          136
8.18.                                                    136
8.19.  termcap                                             137
8.20.  terminfo                                             137
8.21.                                                138
8.22.  (capabilities) terminfo                             138
8.22.1.                                          138
8.22.2.                                                       140
8.22.3.                                                      142
9.   /                            166
9.1.                                           168
9.2.                                         169
9.3.                                       169
9.4.                                      170

                               - 190 -

10.     Linux                            170
10.1.                                                      170
10.2.                                             171
10.2.1.   SVR4, BSD  POSIX.1                              172
10.2.2.   Linux                                       172
10.2.3. signal  Linux-                                        173
10.2.4. ,  Linux-                           174
10.3. /                                         174
10.4.                                          175
10.4.1.  kvm                                           176
10.4.2. ptrace    /proc                            176
10.4.3.    Linux                            176
10.5.                                 178
10.6.                                     179
11.                                      180
12.                                                    187
